如何加速Python中的数组生成?

6 投票
6 回答
538 浏览
提问于 2025-04-16 00:49

我在想我需要用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的线程,这个限制叫做全局解释器锁)。

撰写回答