首页 > 解决方案 > Python3 numpy.fft.fft() 与 Python2 numpy.fft.fft()

问题描述

在我的 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, 1080, 2)
[ 1022.   435.]
('spend time: ', 0.06316184997558594)
% python3 ./test.py
(1920, 1080, 2)
[1143.  678.]
spend time:  0.18218493461608887

python的numpy版本都是1.19.1

Python2:2.7.16

Python3:3.7.3

为什么python2比python3快?

标签: pythonnumpyfft

解决方案


我稍微修改了你的测试,我认为这会改变结论。这是修改后的代码:

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, (1920, 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 更快。


推荐阅读