我使用Python已经有一段时间了,有时会遇到一些内存爆炸的问题。我已经寻找了一些来源来解决我的问题,例如 Memory profiling embedded python 和 https://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倍。而平整时间基本相同。你知道吗
这让我困惑了很久。提前多谢了!你知道吗
如果有人感兴趣,我可以发邮件给你的源代码更清楚的解释。你知道吗
你解决同一个问题的事实并不意味着解决方案的效率。排序数组也存在同样的问题:您可以使用冒泡排序
O(n^2)
,或合并排序O(nlogn)
,或者,如果您可以应用一些限制,您可以使用非比较排序算法,例如具有线性运行时的基数排序或桶排序。你知道吗从不同的节点开始遍历将生成不同的遍历图的方法-其中一些可能是无效的(重复节点更多次)。你知道吗
至于“combinedictionary1tostring1”,这可能是一个非常昂贵的操作,而且由于这个函数是递归调用的(很多次),所以性能可能会非常差。但这只是一个有根据的猜测,如果没有更多关于在这些函数中执行的操作的复杂性的细节,就无法回答。你知道吗
相关问题 更多 >
编程相关推荐