私信  •  关注

Blumer

Blumer 最近创建的主题
Blumer 最近回复了
15 年前
回复了 Blumer 创建的主题 » 最令人沮丧的python黑客是什么?

…什么是最令人沮丧的,但有点常见的,python“黑客”或语言功能滥用,有人可以介绍,这将导致噩梦的未来维护者的代码?

难以重构:

嵌套列表理解 (如在:多层深)。

大多数人(在学习python时)都对列表理解的强大功能和实用性着迷。这可能会导致过度使用它们并构建嵌套很深、复杂的组件。大多数时候,为了可读性和可维护性,相同的代码应该使用简单的循环来编写。我认为三个层次已经嵌套得太深了。

——

而且(重构起来并不难,但最让人恼火的是):

试图像使用python一样使用它 另一个 语言 (没有自己的特定结构);例如:

for i in range(len(mylist)):
    item = mylist[i]
    # do stuff with item

而不是

for i, item in enumerate(mylist):
    # do stuff with item

或者甚至(你为什么需要索引):

for item in mylist:
    # do stuff with item

这包括:当功能已经(恰当地命名)在富标准库中时(糟糕地)重新发明轮子。

还有类型检查,使东西无法子类化等等…

15 年前
回复了 Blumer 创建的主题 » python性能:嵌套列表上的迭代和操作

. 一个(较小的)加速肯定是您的 rows

替换

rows = []
for i in range(x):
    rows.append([0 for i in xrange(y)])

具有

rows = [[0] * y for i in xrange(x)]

. 你也可以通过移动来避免一些查找 random.random 循环之外(节省一点)。

三。 编辑:更正之后——您可以得到如下结果:

def f(x,y,n,z):
    rows = [[0] * y for i in xrange(x)]
    rn = random.random
    for i in xrange(n):
        topleft = (int(x*rn()) - z, int(y*rn()) - z)
        l = max(0, topleft[1])
        r = min(topleft[1]+(z*2), y)
        for u in xrange(max(0, topleft[0]), min(topleft[0]+(z*2), x)):
            rows[u][l:r] = [j+(j<255) for j in rows[u][l:r]]

编辑:一些新的计时与时间IT(10次运行)--似乎这只提供了轻微的加速:

import timeit
print timeit.Timer("f1(1024,1024,400,75)", "from __main__ import f1").timeit(10)
print timeit.Timer("f2(1024,1024,400,75)", "from __main__ import f2").timeit(10)
print timeit.Timer("f(1024,1024,400,75)", "from __main__ import f3").timeit(10)
f1 21.1669280529
f2 12.9376120567
f  11.1249599457