我已经使用了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次。我已经验证两种方法都返回了正确的结果。
可能有人建议为什么这么小的修改会导致如此大的差异?
以前,当我在多源树(具有100,000+个节点)中对节点进行调整时,我也注意到了这一点。如果我从源节点(可能具有最大高度)开始进行水平调整,则内存使用量比来自可能具有最小高度的源节点的内存使用率差100倍。虽然平准化时间大致相同。
这让我困惑了很长时间。非常感谢你!
如果有兴趣的话,我可以通过电子邮件向您发送源代码,以获得更清晰的解释。
答案 0 :(得分:0)
您解决同一问题的事实不应该对解决方案的效率有任何影响。排序数组可以声明同样的问题:您可以使用冒泡排序O(n^2)
或合并排序O(nlogn)
,或者,如果您可以应用某些限制,您可以使用非比较排序算法,如基数或具有线性运行时的bucket-sort。
开始从不同节点遍历将生成遍历图的不同方式 - 其中一些可能是无效的(重复节点更多次)。
至于#34;将dictionary1与string1" - 它可能是一个非常昂贵的操作,因为这个函数被递归地调用(很多次) - 性能可能会显着降低。但这只是一个有根据的猜测,如果没有关于这些功能中执行操作的复杂性的更多细节,就无法回答。