什么是处理具有许多函数的复杂 for 循环的良好 Pythonic 方法?
What is a good Pythonic way to handle complicated for loops with many functions?
我有一个相对复杂的脚本,需要在 for 循环中执行函数,在某些情况下,一个函数的结果会被读入下一个函数。我可以使用 for 循环相对轻松地处理这个问题,但执行速度明显低于列表理解。我不确定如何通过列表理解来解决这个问题。 python 中是否有更好的矢量化方法来执行此操作?我附上了一个比我的实际问题简单得多的例子,但我认为它突出了问题。如有任何想法,我们将不胜感激。
def func1(i):
return i + 1
def func2(j):
return j + 2
def func3(k):
return k + 3
class test:
def __init__(self, one, two, three):
self.one = one
self.two = two
self.three = three
if __name__ == "__main__":
obj = []
for i in range(10):
if i !=3 and i != 7:
value1 = func1(i)
value2 = func2(i)
value3 = func3(value2)
one1 = value1 + value2
two1 = value1 + value2 + value3
three1 = value1 + value3
obj.append(test(one1, two1, three1))
我不知道这是否正是您要查找的内容,但如果您首先创建对值的理解然后填充 obj
列表,则可以用两行稍微更优雅地完成它。
values = [(func1(i), func2(i), func3(func2(i)) for i in range(10) if (i != 3 and i != 7)]
obj = [test(v[0]+v[1], v[0]+v[1]+v[2], v[0]+v[1]) for v in values]
缺点是更多的内存使用,必须将值保存在内存中,但这也应该与上面的代码同时调用每个函数。如果您可以创建一个列表生成器而不是对 values
的理解,那将进一步加快速度。
只需将循环内部填充到它自己的函数中即可。
def loop_interior(i):
value1 = func1(i)
value2 = func2(i)
value3 = func3(value2)
one1 = value1 + value2
two1 = value1 + value2 + value3
three1 = value1 + value3
return test(one1, two1, three1)
现在填充 obj
的循环简短而有趣。如果愿意,您甚至可以使用列表理解。 obj = [loop_interior(i) for i in range(10) if (i != 3 and i != 7)]
我有一个相对复杂的脚本,需要在 for 循环中执行函数,在某些情况下,一个函数的结果会被读入下一个函数。我可以使用 for 循环相对轻松地处理这个问题,但执行速度明显低于列表理解。我不确定如何通过列表理解来解决这个问题。 python 中是否有更好的矢量化方法来执行此操作?我附上了一个比我的实际问题简单得多的例子,但我认为它突出了问题。如有任何想法,我们将不胜感激。
def func1(i):
return i + 1
def func2(j):
return j + 2
def func3(k):
return k + 3
class test:
def __init__(self, one, two, three):
self.one = one
self.two = two
self.three = three
if __name__ == "__main__":
obj = []
for i in range(10):
if i !=3 and i != 7:
value1 = func1(i)
value2 = func2(i)
value3 = func3(value2)
one1 = value1 + value2
two1 = value1 + value2 + value3
three1 = value1 + value3
obj.append(test(one1, two1, three1))
我不知道这是否正是您要查找的内容,但如果您首先创建对值的理解然后填充 obj
列表,则可以用两行稍微更优雅地完成它。
values = [(func1(i), func2(i), func3(func2(i)) for i in range(10) if (i != 3 and i != 7)]
obj = [test(v[0]+v[1], v[0]+v[1]+v[2], v[0]+v[1]) for v in values]
缺点是更多的内存使用,必须将值保存在内存中,但这也应该与上面的代码同时调用每个函数。如果您可以创建一个列表生成器而不是对 values
的理解,那将进一步加快速度。
只需将循环内部填充到它自己的函数中即可。
def loop_interior(i):
value1 = func1(i)
value2 = func2(i)
value3 = func3(value2)
one1 = value1 + value2
two1 = value1 + value2 + value3
three1 = value1 + value3
return test(one1, two1, three1)
现在填充 obj
的循环简短而有趣。如果愿意,您甚至可以使用列表理解。 obj = [loop_interior(i) for i in range(10) if (i != 3 and i != 7)]