この F# 関数のパフォーマンスを比較しています。
let e28 N =
seq {for i in 2L..2L..N do for j in 1..4 -> i} |> Seq.scan (+) 1L |> Seq.sum
Python 3.3 に相当するもの:
def e28a(N = 100000):
diagNumber = 1
sum = diagNumber
for width in range(2, N+1, 2):
for j in range(4):
diagNumber += width
sum += diagNumber
return sum
import itertools as it
def e28b(N = 100000):
return sum(it.accumulate(it.chain([1], (i for i in range(2, N+1, 2) for j in range(4)))))
import numpy as np
def e28c(N = 100000):
return np.sum(np.cumsum(np.fromiter(chain([1], (i for i in range(2, N+1, 2) for j in range(4))), np.int64)))
また、Windows 7 で 64 ビット CPython 3.3.1 のパフォーマンスを取得していますが、C++ よりも約 574 倍遅いです。N = 100000 の場合の時間は次のとおりです。
e28: 23ms; e28a: 48.4ms; e28b: 49.7ms; e28c: 40.2ms; C++ バージョン: 0.07ms
基礎となるアルゴリズムを変更せずに Python コードを最適化することで、簡単に達成できることはありますか?