问题描述
在MacBook Pro上运行以下代码后,我发现python3 numpy.fft.fft比python2快:
import random
import time
# import matplotlib
import numpy as np
from scipy.fftpack import fft
# import cv2
coordinate = np.ndarray((1920,1080,2))
print(coordinate.shape)
for i in range(1920):
for j in range(1080):
coordinate[i][j] = (random.randint(0,1920),random.randint(0,1080))
print(coordinate[0][0])
# test = ([2.+4.j,3.+3.j,4.+4.j,5.+3.j,4.+2.j,3.+1.j,2.+2.j,1.+3.j])
start_time = time.time();
res = np.fft.fft(coordinate)
end_time = time.time();
print("spend time: ",(end_time - start_time));
结果是:
% python2 ./test.py
(1920,2)
[ 1022. 435.]
('spend time: ',0.06316184997558594)
% python3 ./test.py
(1920,2)
[1143. 678.]
spend time: 0.18218493461608887
python的numpy版本均为1.19.1
Python2:2.7.16
python3:3.7.3
为什么python2比python3快?
解决方法
我对您的测试做了一些修改,我认为结论会有所改变。这是修改后的代码:
import random
import time
# import matplotlib
import numpy as np
from scipy.fftpack import fft
# import cv2
np.random.seed(1234)
first = np.random.randint(0,1920,(1920,1080))
second = np.random.randint(0,1080,1080))
coordinate = np.dstack((first,second))
print(coordinate.shape)
print(coordinate[0][0])
start_time = time.time();
for i in range(100):
res = np.fft.fft(coordinate)
end_time = time.time();
print("spend time: ",(end_time - start_time)/100);
首先,我将ftt
函数循环运行100次迭代,以得到更好的平均值。其次,我对所有测试使用了相同的种子,因此,结果数组coordinate
对于所有测试都是相同的。
第三个更改不会影响测试,它只是创建coordinate
数组的更快方法。
我让测试使用python2和python3运行了好几次(不在我的机器上,但是我使用了repl.it),我的结论是并没有太大的区别。就我而言,使用python3进行测试的速度通常要比python2更快。
,我曾在GitHub上发布过以下问题:https://github.com/numpy/numpy/issues/17130