python – 为什么Pypy添加numpy数组会变慢?

为了测试Pypy JIT明显更快的说法,我写了一个简单的代码,重复添加两个大小为1200×1200的数组.我的代码如下

import numpy as np
import random

a=np.zeros((1200, 1200), dtype=np.float32)
b=np.zeros((1200, 1200), dtype=np.float32)
import timeit
#Start timer
start=timeit.default_timer()
#Initialize the arrays
for j in range(1200):
    for k in range(1200):
        a[j][k]=random.random()
        b[j][k]=random.random()
#Repeatedly add the arrays    
for j in range(10):
    a=np.add(a,b)
#Stop timer and display the results
stop=timeit.default_timer()
print stop-start

使用普通的python,执行时间大约是1.2到1.5秒.然而对于Pypy它超过15秒?
同样在上面的例子中,我只添加了10次数组.如果我将此值增加到1000,我的计算机将停止响应.我发现这是因为在使用pypy时几乎消耗了整个RAM.难道我做错了什么?或者是其他问题?

最佳答案 在所有情况下,pypy都不会在numpy数组中进行垃圾收集,这可能是你内存不足,溢出到磁盘然后锁定的原因.

numpy.ndarray objects not garbage collected

Reducing numpy memory footprint in long-running application

Memory profiler for numpy

有两种解决方案.最简单的方法是通过执行以下操作简单地告诉pypy删除数组:

import gc
del my_array
gc.collect()

这将迫使pypy进行垃圾收集.请注意,除非确实需要,否则不应将gc.collect()置于紧密循环中.

第二个更加手动的解决方案是使用CFFI自己创建数组,并使用数组接口告诉他们numpy:https://docs.scipy.org/doc/numpy/reference/arrays.interface.html

这样你仍然可以从numpy操作结构,但你可以手动删除/调整数组大小.

点赞