我正在比较这个 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:23毫秒;e28a:48.4ms;e28b:49.7ms;e28c:40.2ms;C++版本:0.07ms
在不改变底层算法的情况下优化 Python 代码是否容易实现?