簡體   English   中英

更快的Python列表理解

[英]Faster Python List Comprehension

我有一些代碼在我的項目中運行了數千次:

def resample(freq, data):
    output = []
    for i, elem in enumerate(freq):
        for _ in range(elem):
            output.append(data[i])
    return output

例如。 resample([1,2,3], ['a', 'b', 'c']) => ['a', 'b', 'b', 'c', 'c', 'c']

我想盡可能加快速度。 似乎列表理解可能更快。 我努力了:

def resample(freq, data):
   return [item for sublist in [[data[i]]*elem for i, elem in enumerate(frequencies)] for item in sublist]

這是可怕的,也很慢,因為它構建列表然后展平它。 有沒有辦法用一個快速的行列表理解來做到這一點? 或者也許是numpy的東西?

提前致謝!

編輯:答案不一定需要消除嵌套循環,最快的代碼是最好的

我強烈建議使用這樣的生成器:

from itertools import repeat, chain
def resample(freq, data):
    return chain.from_iterable(map(repeat, data, freq))

這可能是最快的方法 - map()repeat()chain.from_iterable()都是用C實現的,這樣你在技術上就無法做得更好。

至於一個小的解釋:

repeat(i, n)返回一個重復項目in次的迭代器。

map(repeat, data, freq)返回一個迭代器,它每次對data元素和freq元素調用repeat。 基本上是一個返回repeat()迭代器的迭代器。

chain.from_iterable()平迭代器的迭代器以返回結束項。

在途中沒有創建列表,因此沒有開銷和額外的好處 - 您可以使用任何類型的數據而不只是一個字符串。

雖然我不建議,但您可以將其轉換為list()如下所示:

result = list(resample([1,2,3], ['a','b','c']))
import itertools
def resample(freq, data):
    return itertools.chain.from_iterable([el]*n for el, n in zip(data, freq))

除了更快,它還具有延遲的優點,它返回一個生成器,並逐步生成元素

根本不需要創建列表,只需使用嵌套循環:

[e for i, e in enumerate(data) for j in range(freq[i])]

# ['a', 'b', 'b', 'c', 'c', 'c']

你可以通過刪除括號輕松地使這個懶惰:

(e for i, e in enumerate(data) for j in range(freq[i]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM