2019年7月1日月曜日

読書環境

開発環境

今日読んだ本、Python計算機科学新教本 ―新定番問題を解決する探索アルゴリズム、k平均法、ニューラルネットワーク (David Kopec(著)、黒川 利明(翻訳)、オライリージャパン)の最初から、目次、1章(簡単な問題)まで読んだ感想とその1.7(練習問題)1の解答を求めてみる。

1章はいろいろなアルゴリズムで使われる基本という感じだった。その中で、様々なプログラミング言語の一般的なことだけではなく、Pythonの機能が使われてるのが他の計算機科学の本とは違う特徴かも。他にも新しめの本だからか、型ヒント(型注釈、型アノテーション)も少なくとも読み終えたところまでは全ての関数、クラス等に使われたのも嬉しいところだったり。

内容については1章までと目次を見た限りではあるけど、ただ様々なアルゴリズムを紹介しているだけという感じではなかった。ある目的、そのためのアルゴリズム、そのアルゴリズムについて簡単なものからそれを効率的なものに改良していく、比較検討していくという一歩ずつ進んでいくという感じ。だからアルゴリズムを知っていてもそこにどうたどり着くかを知ることができて楽しそうな内容。そして各アルゴリズムについて実世界での応用があるから理論だけではなく実践的でもある一冊。

なので、注意点としては、様々なアルゴリズムをさっと調べたいだけの場合には本著は最適な一冊とは言えないかも。あと、プログラムを書いたことがない、あるいはPythonを全く知らないという人は、本著の前に何か入門書を読んだ方が良さそう。

ちなみに本著では入門書として空飛ぶPython即時開発指南書が勧められてた。ただ、読んでないからはっきりとは分からないけど、邦訳版は原著の最新版に追いついてないみたいだから、Pythonの最新の機能、型ヒント等を学習するのには向いてないかも。あと、個人的にお気に入りな機能のPython 3.6から導入されたフォーマット済み文字列リテラル(f-string)の話も出てこなさそうだし。読んだ中でおすすめなPythonの入門書は、本当にプログラミングの入門からなら、Head First はじめてのプログラミング、Pythonの入門については楽しい感じのがいいならHead First Python、きっちりした教科書的なのがいいなら入門Python 3がオススメ。

上記に記述した注意点とは逆で、プログラミングやPythonを楽しそうだから初めてみて入門書は終えたところだけど、次に何を楽しめばいいかわからないという人にとっては最適な一冊。

ということで、早速1章(簡単な問題)の1.7(練習問題)1の解答を求めてみることに。

コード

Python 3

#!/usr/bin/env python3
import time
from functools import lru_cache
from unittest import TestCase, main
from fib2 import *
from fib3 import *
from fib4 import *
from fib5 import *


class FibTestCase(TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_result(self):
        for n in range(20):
            self.assertEqual(fib(n), fib2(n))

    def test_performance(self):
        fibs = [fib2, fib3, fib4, fib5]
        m = 20
        for f in fibs:
            t1: float = time.time()
            for n in range(m):
                fib(n)
            t1 = time.time() - t1
            t2: float = time.time()
            for n in range(m):
                f(n)
            t2 = time.time() - t2
            self.assertLessEqual(t1, t2)


@lru_cache(maxsize=None)
def fib(n: int) -> int:
    if n < 2:
        return n
    a: int = 0
    b: int = 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b


if __name__ == '__main__':
    main()

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))

C:\Users\...>py sample1.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.010s

OK

C:\Users\...>

0 コメント:

コメントを投稿