Python的性能随着内存usag的增加而降低

2024-10-05 14:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下函数将图像转换为哈希值列表(使用PIL):

def _GetImageHash(image):
  st = time.time()
  image_list = list(image.getdata())
  (columns, rows) = image.size
  hash_vals = [0]*rows
  for i in xrange(0,rows):
    hash_vals[i] = hash(tuple(image_list[i*columns:(i+1)*columns]))
  print "_GetImageHash time taken: ", time.time() - st
  return hash_vals, image_list

在另一个函数中,我对许多图像文件调用此方法,并存储结果列表。但是,我观察到,该函数计算哈希值所需的时间随着每次调用而显著增加。如果我改变调用的顺序,它不会改变这个观察到的行为(所有图像的大小都相同,所以这个函数计算散列值所用的时间应该没有明显的差别)。事实上,如果我这样做了:

image1_hash, image1_list = _GetImageHash(image1)
image2_hash, image2_list = _GetImageHash(image1)
image3_hash, image3_list = _GetImageHash(image1)
image4_hash, image4_list = _GetImageHash(image1)
image5_hash, image5_list = _GetImageHash(image1) ...

报道的时间是这样的:

_GetImageHash time taken:  0.672996044159
_GetImageHash time taken:  1.40435290337
_GetImageHash time taken:  2.10946083069
_GetImageHash time taken:  2.84965205193
_GetImageHash time taken:  3.57753205299
_GetImageHash time taken:  4.71754598618
_GetImageHash time taken:  5.10348200798
_GetImageHash time taken:  5.83603620529
_GetImageHash time taken:  6.57408809662
_GetImageHash time taken:  7.30649399757
_GetImageHash time taken:  7.26073002815
_GetImageHash time taken:  7.94218182564

似乎发生这种情况是因为我正在存储列表。但是为什么性能会因为内存使用而受到影响呢?是否可以采取一些措施来解决这个问题,这样内存使用就不会对时间性能产生如此严重的影响?你知道吗


Tags: columns函数图像image列表time时间hash
2条回答

你可以尝试禁用垃圾收集器

import gc
gc.disable()

#your code

gc.enable()

我不知道你的图片有多大,但如果你认为这是内存问题,我会先检查这个过程使用了多少内存。您可以在线找到一个方法来调用进程(例如here),或者只跟踪操作系统进程监视器中的内存使用情况。你知道吗

如果是内存使用的话,我要做的第一件事就是用更紧凑的东西替换列表版本image\u list。Numpy数组是理想的,但即使是标准库模块array也应该有所帮助。你知道吗

我说应该,因为如果image_list中的值都是小整数(低于大约256),那么Python使用的是更小、紧凑的存储,而不是重新分配那些int。不过,它正在重新分配列表中的指针以容纳它们。如果让数组包含4(8)个字节的值,那么这将与32(64)位系统上列表使用的指针大小相同。我没有用过PIL,所以我不熟悉pil.Image.getdata文件. 你知道吗

相关问题 更多 >