【问题标题】:python beginner performance : for loop Vs iterator Vs Pandaspython初学者性能:for循环Vs迭代器Vs Pandas
【发布时间】:2021-12-25 08:44:17
【问题描述】:

出于学习目的,我收到了银行对账单 作为 csv 文件:

data = pd.read_csv('./datasets/code/analyse/operations.csv')
data.columns = ['identifiant_transaction', 'date_operation', 'date_valeur', 'libelle', 'debit', 'credit', 'solde']
print(data.libelle.head())

这样的女巫显示:

0    FORFAIT COMPTE SUPERBANK XX XX XX XX
1                 CARTE XX XX CHEZ LUC XX
2          PRELEVEMENT XX TELEPHONE XX XX
3                 CARTE XX XX XX XX XX XX
4                       CARTE XX XX XX XX
Name: libelle, dtype: object

我的目标是提取“libelle”中最常用的词:

XX          142800
CARTE        24700
VIREMENT      2900
ROBINSON      2000
ANCIENS       2000

我第一次尝试:

def most_common_words(labels):
    words = []
    for lab in labels:
        words += lab.split(" ")
    return Counter(words).most_common()

然后:

def most_common_words_iter(labels):
    return Counter(chain(*(words.split(" ") for words in labels))).most_common()

最后:

def most_common_words_pandas(labels):    
    return labels.str.split().explode().value_counts(sort=True)

我的假设是第一个解决方案会因为中间列表而变慢,而第二个或第三个解决方案可能会引发一些免费的集成优化(矢量化、更好的流管理、更少的内存分配......)。但是,没有:-/

python vs iterable vs pandas

它应该是这样吗?还是我应该换一种方式?

【问题讨论】:

    标签: python pandas performance for-loop iterator


    【解决方案1】:

    通过修改“python”版本,我得到了一些改进(30-40%):

    def most_common_words(labels):
        words = ' '.join(labels.values)
        words = words.split(' ')
        return Counter(words).most_common()
    

    【讨论】:

    • 谢谢,您的解决方案也很容易阅读。它使其他两个更落后,这让我更加想我错过了他们的一些东西
    • 我发现pandas 通常不是最有效的——它有利于快速、干净地编写代码。当这样的部分成为瓶颈时,我必须将其重写为 numpy/pure python
    • 谢谢。这可能是公认的解决方案。我会把它打开一点,看看是否有人有任何其他见解
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 2017-07-12
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多