繁体   English   中英

Python:如何在分配过程中保持可变的内存位置?

[英]Python: How to keep variable memory location across assignment?

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

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

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

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

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

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

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

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

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

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

您仍然无法使用将要创建副本和/或进行新赋值的功能和运算符(与您尚未使用的功能和运算符相同),但是在函数外部可以看到函数参数的直接突变。功能。

这是您要尝试做的事情吗?

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]
>>>

返回数组后,原始代码将复制该数组。 通常这不是有用的做法,它会导致运行时间变慢。

如何使用本地值并将其引用为全局值。 我想它可能会更快...

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

嗯..我也必须使用cProfiler进行测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM