避免python中的循环
我知道循环在python中是个坏主意,我应该避免它们 嗯,我有几个我想避免的 我有一张名为Lipide的物品清单:避免python中的循环,python,loops,Python,Loops,我知道循环在python中是个坏主意,我应该避免它们 嗯,我有几个我想避免的 我有一张名为Lipide的物品清单: class bead: x = 0 y = 0 z = 0 LID = 0 t = 0 class lipid: h = bead() b = bead() t = bead() LID = 0 我正在做以下工作(代码如下): 初始化覆盖所有类脂和 确定它们是否计为U或向下 将值添加到相应的h 至少,我如何
class bead:
x = 0
y = 0
z = 0
LID = 0
t = 0
class lipid:
h = bead()
b = bead()
t = bead()
LID = 0
我正在做以下工作(代码如下):
U
或向下h
class h:
cU = 0
cD = 0
hU = 0
hD = 0
h = 0
for i in range(0,8):
hs.append([])
for j in range(0,8):
index = (i,j)
hn = h()
hs[i].append(hn)
for LID in lipids:
l = lipids[LID]
up = l.h.z > l.t.z
X = (int)(l.b.x*8/L)
Y = (int)(l.b.y*8/L)
Z = (l.b.z)*0.5
if up:
hs[X][Y].hU += Z
hs[X][Y].cU += 1
else:
hs[X][Y].hD += Z
hs[X][Y].cD += 1
2和3:
class h:
cU = 0
cD = 0
hU = 0
hD = 0
h = 0
for i in range(0,8):
hs.append([])
for j in range(0,8):
index = (i,j)
hn = h()
hs[i].append(hn)
for LID in lipids:
l = lipids[LID]
up = l.h.z > l.t.z
X = (int)(l.b.x*8/L)
Y = (int)(l.b.y*8/L)
Z = (l.b.z)*0.5
if up:
hs[X][Y].hU += Z
hs[X][Y].cU += 1
else:
hs[X][Y].hD += Z
hs[X][Y].cD += 1
循环是个不错的主意。只是循环密集型代码可能很慢。但这并不是特定于循环的,只是Python总体上不如其他一些语言快。如果循环是算法中最自然的表达式,我建议您不要避免循环。如果您的代码比您期望或需要的慢,那么寻找优化它的方法(首先是评测)
Wikipedia中的算法分析可能会对您有所帮助。下面是一个使用列表理解创建2d数组的示例:
hs = [[h() for i in range(8)] for j in range(8)]
然而,正如评论中所指出的,这与为循环编写代码没有什么不同,因为列表理解是语法上的糖分。如果在可读性和维护方面更方便,就使用它
注意:正如一条评论所指出的,列表理解的另一个好处是,对于循环和
映射
函数,它们通常比提供更好的性能。谁告诉过你循环是坏的?我知道循环在python中是个坏主意,我应该避免它们。
--wat?你从哪里得到这个主意的?鼓励迭代而不是递归。现在,许多简单的for
循环可以用语法糖代替(用更好的源代码做同样的事情的一种方法)。但这些只是编写循环的更好方法,即使是“循环密集型代码可能很慢”也没有多大意义。如果您的算法是O(n),那么无论循环是否隐式,它都将是O(n)。很多很多问题都需要一些O(n)算法。如果你把一个循环推到优化的C代码中,常数因子会稍微低一点,但它仍然是一个循环(尽管如果你那么绝望,这是一个有效的优化)。+1到你的注释@delnan。我正在相应地编辑我的答案。这和写循环没有什么不同,因为列表理解是语法上的糖分。-事实并非如此,列表理解比for循环快,因为循环是在C级别实现的,而不是在Python级别实现的。它们也比map()函数快。@Lattyware感谢您的评论。我已经对此进行了研究,虽然您在大多数情况下完全正确,但似乎仍有一些情况下,map
比前面解释的列表理解更快。