如何加速Python中的数组生成?
我在想我需要用numpy或者其他一些库来快速填充这些数组,但我对这些不太了解。目前这个操作在一台四核的英特尔电脑上大约需要1秒钟,但我希望它能快一点。任何帮助都非常感谢。谢谢!
import cv
class TestClass:
def __init__(self):
w = 960
h = 540
self.offx = cv.CreateMat(h, w, cv.CV_32FC1)
self.offy = cv.CreateMat(h, w, cv.CV_32FC1)
for y in range(h):
for x in range(w):
self.offx[y,x] = x
self.offy[y,x] = y
6 个回答
1
Numpy中的代码正好实现了你在OpenCV Python中所做的事情。
import numpy as np
offsetx, offsety = np.meshgrid(range(960),range(540))
如果你在使用Python,学习一下numpy的各种功能会对你大有帮助。OpenCV的功能也可以直接和numpy数组一起使用。不过,numpy在Python中的语法比OpenCV要好很多。
下面是我在i7上运行这两个版本的时间。
time python test.py
real 0m0.654s
user 0m0.640s
sys 0m0.010s
我的版本:
time python test2.py
real 0m0.075s
user 0m0.060s
sys 0m0.020s
8
我这台八年的(慢)电脑能在127毫秒内创建一个和你们的矩阵一样大小的列表。
C:\Documents and Settings\gdk\Desktop>python -m timeit "[[x for x in range(960)]
for y in range(540)]"
10 loops, best of 3: 127 msec per loop
我不知道cv模块是什么,也不知道它是怎么创建矩阵的。不过这可能是代码运行慢的原因。
Numpy可能会更快。比如说,创建一个由(python int
)1组成的数组:
C:\Documents and Settings\gdk\Desktop>python -m timeit -s "from numpy import one
s" "ones((960, 540), int)"
100 loops, best of 3: 6.54 msec per loop
你可以比较使用不同模块创建矩阵所需的时间,看看换用其他模块是否会更快:timeit模块
1
你正在生成50万个整数,同时还创建了超过100万个引用。能在1秒钟内完成,我觉得已经很不错了。
如果你经常这样做,应该考虑一些方法来缓存结果,也就是把结果存起来,以后可以直接用,不用每次都重新计算。
另外,使用四核的电脑在这种情况下也没什么帮助,因为你在做的操作是串行的,也就是说一次只能在一个核心上执行(即使你用了多线程,CPython也只能同时执行一个纯Python的线程,这个限制叫做全局解释器锁)。