我的代码可能很慢:
onlyPositives = map ( (lambda mylist: [elem for elem in mylist if elem > 0]) , myintlist )
什么是快速的方法?(对于 100 万个大小为 50 整数的子列表)。
我的代码可能很慢:
onlyPositives = map ( (lambda mylist: [elem for elem in mylist if elem > 0]) , myintlist )
什么是快速的方法?(对于 100 万个大小为 50 整数的子列表)。
单独定义函数而不是使用 alambda
并使用列表推导而不是map()
:
def func(mylist):
return [elem for elem in mylist if elem > 0]
onlyPositives = [func(e) for e in myintlist]
根据下面的评论,我认为值得分析这段代码的各种版本,包括map()
,filter()
和生成器表达式,看看什么是最快的。
但是,拥有一百万个子列表,您能做的只有这么多。
首先,我假设您的数据结构和算法无法改进。
在这种情况下,您的算法实现没有任何问题。正如 Simeon Visser 所指出的,可能有一些方法可以稍微降低开销,但在那里你能完成的只有这么多。
但是,如果您愿意超越加快 Python 的速度,还有三个大的选择:
ndarray
,这是值得作弊的。)这里有几种方法 - 第一种是您提供的方法。顺便说一句,函数调用在 CPython 中具有相对显着的开销。为了速度,你最好使用 pypy、numba 或 cython。如果你想继续使用朴素的 CPython,lambda 和 def 会减慢速度。
#!/usr/bin/python3
myintlist = [ [ 1, 2, 3, -1, -6, 0 ], [ 5, 6, 7, -4, 2, -6, 3, -6, 0, 10] ]
onlyPositives = map ((lambda mylist: [ elem for elem in mylist if elem > 0 ]), myintlist)
print(onlyPositives)
onlyPositives2 = []
for input_sublist in myintlist:
output_sublist = (element for element in input_sublist if element > 0)
onlyPositives2.append(output_sublist)
print(onlyPositives2)
# You could change the list comprehension to another generator expression if you want
onlyPositives3 = ([element for element in input_sublist if element > 0] for input_sublist in myintlist)
print(onlyPositives3)