26

我有一个非常大的 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的新手。

谁能让我走上正确的道路?我怎样才能分解这个大脚本,以便它使用更少的内存?是否值得将很少使用的代码放入模块中并仅在需要时调用它们?

4

5 回答 5

43

组织:

你的 python 脚本看起来确实很大,也许你应该考虑先重新组织你的代码,把它分成几个模块或包。它可能会使代码分析和优化任务更容易。

你可能想看看那里:

并且可能:

优化:

有很多事情可以用来优化你的代码......

例如,关于您的数据结构......如果您大量使用列表或列表推导式,您可以尝试找出您真正需要列表的位置,以及它们可能被不可变数据结构(如元组或“volatile”对象,“lazy”容器,如生成器表达式。

看:

在这些页面上,您可以找到一些有用的信息和提示:

此外,你应该研究你的做事方式,并想知道是否有一种方法可以减少贪婪,一种最好在 Python 中做的方法(你会在标签pythonic中找到一些提示)......尤其是在 Python 中确实如此,因为在 Python 中,通常有一种“明显”的方式(而且只有一种)可以做比其他更好的事情(参见Python 之禅),这被称为pythonic。它与您的代码的形状并没有特别的关系,但也 - 最重要的是 - 与性能有关。与许多提倡应该有多种方法来做任何事情的语言不同,Python 更喜欢只关注最好的方法。所以很明显,做某事有很多方法,但通常,一种是真的更好的。

现在,您还应该验证您是否使用了最好的方法来做事,因为 pythonicality 不会为您安排算法。

但最后,它会根据您的代码而有所不同,并且如果没有看到它就很难回答。

并且,请务必考虑eumiroAmr的评论。

于 2012-06-12T18:50:18.500 回答
5

这个视频可能会给你一些好主意: http: //pyvideo.org/video/451/pycon-2011---quot-dude--where--39-s-my-ram--quot-

于 2012-06-12T18:33:43.680 回答
3

关于生成器表达式和使用模块的建议很好。过早的优化会导致问题,但在坐下来编写代码之前,您应该始终花几分钟时间思考您的设计。特别是如果该代码旨在被重用。

顺便说一句,您提到您在脚本顶部定义了很多数据结构,这意味着它们在开始时都已加载到内存中。如果这是一个非常大的数据集,请考虑将特定数据集移动到单独的文件中,并仅在需要时加载它。(使用csv模块,或numpy.loadtxt()等)

除了使用更少的内存之外,还要寻找更有效地使用内存的方法。例如,对于大型数值数据集,numpy 数组是一种存储信息的方式,可以在计算中提供更好的性能。在http://wiki.python.org/moin/PythonSpeed/PerformanceTips有一些稍微过时的建议

于 2012-06-12T19:01:56.647 回答
2

移动函数不会改变你的内存使用情况。一旦您导入该其他模块,它将定义该模块中的所有功能。但是函数不会占用太多内存。它们是否非常重复,也许您可​​以通过重构函数来减少代码?

@eumiro 的问题是对的:您确定您的脚本使用了太多内存吗?它使用了多少内存,为什么太多了?

于 2012-06-12T18:11:37.587 回答
1

如果您正在利用 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 的使用情况,看看它是否真的做了什么。在理解这可能最终无法正常工作的情况下,小心破坏代码(令人震惊)。

于 2019-05-07T22:25:08.330 回答