2

我对 Python 还是很陌生,所以如果这个问题很愚蠢,请原谅我。我无法通过谷歌找到答案...

我在我的代码中使用 PyFFTW,它有一个规划阶段,您可以在其中将两个变量(源/目标)传递给它,您可以从/到进行转换。然后,当您调用 FFT 时,它将在计划阶段这些变量所在的确切内存空间上运行。因此,对变量所做的任何操作都需要完成,以便这两个变量在内存中的位置不会改变。我找到了对标准数学运算符执行此操作的运算符 、 等*=+=但是在我的程序中,我需要对变量应用一个函数,它应该将它返回到相同的内存位置。这该怎么做?!

我最初以以下方式使用切片:

a[:] = func(a)[:]

但是我刚刚意识到,这非常慢(我的代码慢了大约 10%)。那么有人知道该怎么做吗?

非常感谢任何帮助。提前致谢!

4

4 回答 4

0

您的变量是可变类型,因此您的函数可以直接对其进行操作。

您仍然无法使用将创建副本和/或进行新分配的函数和运算符(您已经无法使用的相同),但函数参数的直接突变将在外部可见功能。

于 2011-03-10T16:50:16.990 回答
0

这是你想做的事情吗?

def time10(a):
  """ multiple the elements by 10 in-place """
  for i in xrange(len(a)):
    a[i] *= 10
  # returning a is optional. I think it maybe useful for use to chain the operation
  return a

>>> a = range(10)
>>> time10(a)
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> b = range(10)
>>> time10(time10(b))
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
>>> b
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
>>>

您的原始代码在返回后复制数组。这通常不是一种有用的做法,并且会导致运行时间变慢。

于 2011-03-10T18:16:46.083 回答
0

如何使用局部值并将其引用到全局值。我想它可以更快...

global a
a = []
def test(): 
    global a
    b = [1,2,3,4]
    a = b
....

嗯..我还必须用 cProfiler 测试它

于 2011-03-11T04:50:00.167 回答
0

所以最后我找不到令人满意的解决方案。我最初最终使用了上面 delnan 提出的解决方案

a[:] = func(a)[:]

并预分配一定大小的数组。很抱歉将此添加为我的答案,因为我不知道如何/是否可以接受 delnans 评论作为答案...

于 2013-12-31T13:22:07.520 回答