Поскольку вы упоминаете научный код, взгляните на numpy
. То, что вы делаете, вероятно, уже сделано (или, скорее, оно использует LAPACK для таких вещей, как SVD). Когда вы слышите о том, что python используется для научного кода, люди, вероятно, не имеют в виду использовать его так, как вы это делаете в своем примере.
В качестве быстрого примера:
(Если вы используете python3, в вашем примере будет использоваться деление с плавающей запятой. В моем примере предполагается, что вы используете python2.x, и, следовательно, целочисленное деление. Если нет, укажите i = np.arange(9999, dtype=np.float)
и т. Д.)
import numpy as np
i = np.arange(9999)
j = np.arange(1, 9999)
print np.divide.outer(i,j).sum()
Чтобы дать некоторое представление о времени ... (здесь я буду использовать деление с плавающей запятой вместо целочисленного деления, как в вашем примере):
import numpy as np
def f1(num):
total = 0.0
for i in range(num):
for j in range(1, num):
total += (float(i) / j)
return total
def f2(num):
i = np.arange(num, dtype=np.float)
j = np.arange(1, num, dtype=np.float)
return np.divide.outer(i, j).sum()
def f3(num):
"""Less memory-hungry (and faster) version of f2."""
total = 0.0
j = np.arange(1, num, dtype=np.float)
for i in xrange(num):
total += (i / j).sum()
return total
Если мы сравним время:
In [30]: %timeit f1(9999)
1 loops, best of 3: 27.2 s per loop
In [31]: %timeit f2(9999)
1 loops, best of 3: 1.46 s per loop
In [32]: %timeit f3(9999)
1 loops, best of 3: 915 ms per loop