带嵌入式函数的Python内存爆炸

2024-06-26 01:47:37 发布

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

我使用Python已经有一段时间了,有时会遇到一些内存爆炸的问题。我已经寻找了一些来源来解决我的问题,例如 Memory profiling embedded pythonhttps://mflerackers.wordpress.com/2012/04/12/fixing-and-avoiding-memory-leaks-in-python/https://docs.python.org/2/reference/datamodel.html#object.del但是,它们都不适合我。你知道吗

我目前的问题是使用嵌入式函数时内存爆炸。以下代码可以正常工作:

class A:
  def fa:
    some operations
    get dictionary1
    combine dictionary1 to get string1
    dictionary1 = None
    return *string1*

  def fb: 
    for i in range(0, j):
      call self.fa
      get dictionary2 by processing *string1* 
      # dictionary1 and dictionary2 are basically the same. 
      update *dictionary3* by processing dictionary2
      dictionary2 = None
    return *dictionary3*

class B:
  def ga: 
    for n in range(0, m):
      call A.fb # as one argument is updated dynamically, I have to call it within the loop 
      processes *dictoinary3*
    return something

当我注意到我不需要将dictionary1组合到string1时,问题就出现了,我可以直接将dictionary1传递给A.fb。我这样实现了它,然后程序变得非常慢,内存使用量激增了10倍以上。我已经验证了这两个方法都返回了正确的结果。你知道吗

有谁能提出为什么这么小的修改会导致如此大的差异?你知道吗

以前,我在对多源树(有100000多个节点)中的节点进行分级时也注意到了这一点。如果我从源节点(可能具有最大的高度)开始进行级别化,那么内存使用情况比从源节点(可能具有最小的高度)开始的要差100倍。而平整时间基本相同。你知道吗

这让我困惑了很久。提前多谢了!你知道吗

如果有人感兴趣,我可以发邮件给你的源代码更清楚的解释。你知道吗


Tags: and内存inhttpsgetfbreturn节点
1条回答
网友
1楼 · 发布于 2024-06-26 01:47:37

你解决同一个问题的事实并不意味着解决方案的效率。排序数组也存在同样的问题:您可以使用冒泡排序O(n^2),或合并排序O(nlogn),或者,如果您可以应用一些限制,您可以使用非比较排序算法,例如具有线性运行时的基数排序或桶排序。你知道吗

从不同的节点开始遍历将生成不同的遍历图的方法-其中一些可能是无效的(重复节点更多次)。你知道吗

至于“combinedictionary1tostring1”,这可能是一个非常昂贵的操作,而且由于这个函数是递归调用的(很多次),所以性能可能会非常差。但这只是一个有根据的猜测,如果没有更多关于在这些函数中执行的操作的复杂性的细节,就无法回答。你知道吗

相关问题 更多 >