私のコードはおそらく遅いです:
onlyPositives = map ( (lambda mylist: [elem for elem in mylist if elem > 0]) , myintlist )
それを行うための速い方法は何ですか?(サイズ 50 int の 100 万個のサブ リストの場合)。
私のコードはおそらく遅いです:
onlyPositives = map ( (lambda mylist: [elem for elem in mylist if elem > 0]) , myintlist )
それを行うための速い方法は何ですか?(サイズ 50 int の 100 万個のサブ リストの場合)。
a を使用する代わりに関数を個別に定義し、 の代わりにlambda
リスト内包表記を使用しますmap()
。
def func(mylist):
return [elem for elem in mylist if elem > 0]
onlyPositives = [func(e) for e in myintlist]
以下のコメントに基づいて、このコードのさまざまなバージョンをプロファイリングする価値があると思いmap()
ますfilter()
.
ただし、100 万個のサブリストがある場合、できることは限られています。
まず、データ構造とアルゴリズムを改善できないと仮定します。
その場合、アルゴリズムの実装に問題はありません。Simeon Visser が指摘しているように、オーバーヘッドを少し下げる方法はあるかもしれませんが、そこで達成できることは限られています。
しかし、Python を高速化する以上のことを望むなら、次の 3 つの大きな選択肢があります。
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)