我正在比较这个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)))
我正在使用64位的CPython 3.3.1,在Windows 7上的性能大约比C++慢574倍。这是N = 100000时的时间:
e28: 23毫秒;e28a: 48.4毫秒;e28b: 49.7毫秒;e28c: 40.2毫秒;C++版本:0.07毫秒
有没有一些简单易行的方法来优化Python代码而不改变底层算法?