gpt4 book ai didi

python - Python中的高效内存

转载 作者:IT老高 更新时间:2023-10-28 21:13:11 25 4
gpt4 key购买 nike

我有一些任务要解决,目前最重要的部分是使脚本尽可能节省时间。我正在尝试优化的元素之一是在其中一个函数中进行内存。

所以我的问题是:以下 3-4 种方法中哪一种是在 Python 中实现内存的最有效/最快的方法?

我提供的代码仅作为示例 - 如果其中一种方法更有效,但不是我提到的情况,请分享你所知道的。

解决方案 1 - 使用外部范围的可变变量

此解决方案通常显示为示例内存,但我不确定它的效率如何。我听说使用全局变量(在这种情况下,它是外部变量,而不是全局范围的变量)效率较低。

def main():
memo = {}
def power_div(n):
try:
return memo[n]
except (KeyError):
memo[n] = (n ** 2) % 4 # example expression, should not matter
return memo[n]
# extensive usage of power_div() here

解决方案 2 - 使用默认的可变参数

我在某处发现过去使用默认可变参数从外部范围传递变量,当 Python 首先在本地范围内搜索变量时,然后在全局范围内,跳过非本地范围(在这种情况下main() 函数中的作用域。因为默认参数仅在定义函数时才被初始化,并且只能在内部函数内部访问,也许它因此更有效?

def main():
def power_div(n, memo={}):
try:
return memo[n]
except (KeyError):
memo[n] = (n ** 2) % 4 # example expression, should not matter
return memo[n]
# extensive usage of power_div() here

或者也许以下版本(实际上是解决方案 1 和 2 的组合)更有效?

def main():
memo = {}
def power_div(n, memo=memo):
try:
return memo[n]
except (KeyError):
memo[n] = (n ** 2) % 4 # example expression, should not matter
return memo[n]
# extensive usage of power_div() here

解决方案 3 - 函数的属性

这是 Python 中另一个非常常见的 memoization 示例 - memoization 对象存储为函数本身的属性。

def main():
def power_div(n):
memo = power_div.memo
try:
return memo[n]
except (KeyError):
memo[n] = (n ** 2) % 4 # example expression, should not matter
return memo[n]
# extensive usage of power_div() here

总结

我对您对上述四种记忆化解决方案的意见非常感兴趣。同样重要的是,使用 memoization 的函数在另一个函数中。

我知道还有其他用于内存的解决方案(例如 Memoize decorator ),但我很难相信这是比上面列出的更有效的解决方案。如果我错了,请纠正我。

提前致谢。

最佳答案

变量访问的不同风格已经在 http://code.activestate.com/recipes/577834-compare-speeds-of-different-kinds-of-access-to-var 进行了计时和比较。这是一个快速总结:本地访问胜过非本地(嵌套范围),后者胜过全局访问(模块范围),后者胜过对内置函数的访问。

您的解决方案 #2(具有本地访问权限)应该会胜出。解决方案#3 有一个慢点查找(需要字典查找)。解决方案 #1 使用非本地(嵌套范围)访问,该访问使用单元变量(比 dict 查找快,但比本地慢)。

另外请注意,KeyError 异常类是一个全局查找,可以通过本地化来加速。您可以完全替换 try/except 并使用 memo.get(n, sentinel) 代替。甚至可以通过使用绑定(bind)方法来加快速度。当然,您最简单的速度提升可能只是来自尝试 pypy :-)

简而言之,有很多方法可以调整此代码。只要确保它是值得的。

关于python - Python中的高效内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9108238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com