gpt4 book ai didi

python 不循环优化函数

转载 作者:行者123 更新时间:2023-12-01 05:26:53 25 4
gpt4 key购买 nike

我有一个基本的“餐巾算法”,它获取元组列表(有 2 个项目)并更改它们。这是英文版:

  1. 如果第 2 项是列表,则将第 1 项更改为字符串 x
  2. 否则将第 1 项更改为字符串 y

这是我整理的一个快速函数,可以实现此目的:

def f(objects):
list_type = "string_x"
other = "string_y"
hold = []
for x in objects:
if isinstance(x[1],list):
hold.append((list_type,x[1]))
else:
hold.append((other,x[1]))
return hold

我不认为这是最有效的方法。这个算法很简单,只是一个基本的表述。 更有效的方法是什么?

最佳答案

您可以使用 if 表达式使其变得更短:

def f(objects):
list_type = "string_x"
other = "string_y"
hold = []
for x in objects:
hold.append((list_type if isinstance(x[1], list) else other, x[1]))
return hold

然后很容易变成推导式,甚至更短,可能更具可读性,而且速度更快:*

def f(objects):
list_type = "string_x"
other = "string_y"
return [(list_type if isinstance(x[1], list) else other, x[1])
for x in objects]

实际上,我不确定这些局部变量是否会让事情变得更清晰:**

def f(objects):
return [("string_x" if isinstance(x[1], list) else "string_y", x[1])
for x in objects]

同时,如果您要对返回的列表执行的唯一操作是迭代它(例如,因为这只是一系列转换中的一个),则您根本不应该返回列表。要么yield每个值,返回一个geneexpr而不是一个listcomp,或者(如果你有Python 3.3+)获得两全其美:

def f(objects):
yield from (("string_x" if isinstance(x[1], list) else "string_y", x[1])
for x in objects)
<小时/>

* 您仍在执行完全相同的循环,因此您具有完全相同的算法复杂性。然而,循环和列表附加都是通过采用一些快捷方式的自定义字节码进行的,从而使每次迭代更加高效。 (“自定义字节码”细节当然特定于 CPython 和 PyPy 等其他字节码兼容实现,但一般来说,任何实现至少可以在列表推导式上采用快捷方式。)

** 这最后一个可能会稍微快一些,因为它将一个常量而不是局部变量加载到堆栈上。不过,它的缓存局部性也可能稍差一些。如果它真的很重要,请测试一下并查看。

关于python 不循环优化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21194254/

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