我有一个非常大的python脚本,200K,我想用尽可能少的内存。它看起来像:
# a lot of data structures
r = [34, 78, 43, 12, 99]
# a lot of functions that I use all the time
def func1(word):
return len(word) + 2
# a lot of functions that I rarely use
def func1(word):
return len(word) + 2
# my main loop
while 1:
# lots of code
# calls functions
如果我把我很少使用的功能放在一个模块中,并且只在必要时动态导入它们,我就无法访问数据。就我而言,就是这样。
我是python的新手。
有人能把我放在正确的道路上吗?如何打破这个大脚本,以便它使用更少的内存?是否值得将很少使用的代码放在模块中,只在需要时调用它们?
答案 0 :(得分:30)
<强> Organzing:强>
你的python脚本看起来确实很大,也许你应该考虑首先重组代码,分成几个modules or packages。它可能会使代码分析和优化任务变得更容易。
你可能想看看那里:
可能:
<强>优化强>
可以为优化代码做很多事情......
例如,关于您的数据结构......如果您大量使用列表或列表推导,您可以尝试找出您真正需要列表的位置,以及它们可能被非可变数据结构替换的位置像元组或“volatile”对象,“懒惰”容器,如生成器表达式。
请参阅:
在这些页面上,您可以找到一些有用的信息和提示:
另外,你应该研究你的做事方式,并想知道是否有办法减少贪婪,这种做法最好用Python做(你会在标签中找到一些提示pythonic )...在Python中尤其如此,因为在Python中,通常有一种“明显”的方式(并且只有一种)来做比其他更好的事情(参见{{3} }),据说是 pythonic 。它与你的代码的形状没有特别的关系,而且最重要的是与表演有关。与许多语言不同,Python提出了应该有很多方法可以做任何事情的方法,但Python更喜欢只关注最好的方法。显然,有很多方法可以做某事,但通常情况下,真的更好。
现在,您还应该验证您是否使用最佳方法进行操作,因为pythonicality不会为您安排算法。
但最后,这很依赖于你的代码,如果没有看到它就很难回答。
并且,请务必考虑The Zen of Python和eumiro发表的评论。
答案 1 :(得分:4)
答案 2 :(得分:3)
关于生成器表达式和使用模块的建议很好。过早优化会导致问题,但在开始编写代码之前,您应该花几分钟时间考虑一下您的设计。特别是如果要重用该代码。
顺便提一下,你提到你在脚本的顶部定义了很多数据结构,这意味着它们在开始时都被加载到内存中。如果这是一个非常大的数据集,请考虑将特定数据集移动到单独的文件,并仅在需要时加载它们。 (使用csv
模块或numpy.loadtxt()
等)
与使用较少的内存分开,还要研究如何更有效地使用内存。例如,对于大型数值数据集,numpy数组是一种存储信息的方式,可以在计算中提供更好的性能。在http://wiki.python.org/moin/PythonSpeed/PerformanceTips
上有一些稍微过时的建议答案 3 :(得分:2)
移动函数不会改变您的内存使用情况。只要导入其他模块,它就会定义模块中的所有功能。但是功能不占用太多内存。它们是非常重复的,也许你可以通过重构函数来减少代码吗?
@ eumiro的问题是对的:你确定你的脚本使用了太多内存吗?它使用了多少内存,为什么它太多了?
答案 4 :(得分:0)
如果您要利用OOP并拥有一些对象,请说:
class foo:
def __init__(self, lorem, ipsum):
self.lorem = lorem
self.ipsum = ipsum
# some happy little methods
通过放入以下对象,可以使对象占用更少的内存:
__slots__ = ("lorem", "ipsum")
在__init__
函数之前,如下所示:
class foo:
def __init__(self, lorem, ipsum):
self.lorem = lorem
self.ipsum = ipsum
# some happy little methods
当然,“过早的优化是万恶之源”。还可以在添加前后配置mem的使用情况,以查看它实际上是否有作用。谨防打破代码(嘲笑),因为这可能最终无法正常工作。