簡體   English   中英

將字符串列表快速拆分為元組列表

[英]Splitting a list of strings into list of tuples rapidly

我試圖找出如何盡可能多地從我的代碼中擠出性能,並且我面臨着在元組轉換中損失大量性能的問題。

with open("input.txt", 'r') as f:
    lines = f.readlines()

lines = [tuple(line.strip().split()) for line in lines]

不幸的是,我的代碼的某個組件要求列表在拆分后包含元組而不是列表,但是以這種方式將列表轉換為元組非常慢。 有沒有辦法強制.split()返回元組或更快地執行此轉換,或者我是否必須更改其余代碼以避免.split()

創建元組似乎並不是特別慢

我不認為元組創建是這個問題的性能瓶頸。 (在運行讀取 6.2MB 大小的文本文件時進行分析)

代碼:

import cProfile


def to_tuple(l):
    return tuple(l)


with open('input.txt', 'r') as f:
    lines = f.readlines()
cProfile.run("lines = [to_tuple(line.strip().split()) for line in lines]")

個人資料結果:

time python3 tuple-perf.py
         385375 function calls in 0.167 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.072    0.072    0.165    0.165 <string>:1(<listcomp>)
        1    0.002    0.002    0.166    0.166 <string>:1(<module>)
   128457    0.017    0.000    0.017    0.000 tuple-perf.py:5(to_tuple)
        1    0.000    0.000    0.167    0.167 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
   128457    0.062    0.000    0.062    0.000 {method 'split' of 'str' objects}
   128457    0.013    0.000    0.013    0.000 {method 'strip' of 'str' objects}

如果您對分析結果的觀察不同,您可以編輯答案以添加更多詳細信息。

可能的解決方案

  1. 使用生成器
iter_lines = (tuple(line.strip().split()) for line in lines)

如果您可以異步處理行,這將很有用。 例如,如果您需要每行發送一個 API 請求或將它們發布到消息隊列,以便這些行可以由另一個進程處理,使用生成器可以讓您通過管道傳輸工作負載,而不必等待所有行都被處理第一的。

但是,如果您需要一次將所有行作為下一步數據處理的輸入數據,那將無濟於事。

  1. 使用另一種快速語言來處理那部分數據

如果您需要一個包含完整數據的列表並且仍然需要壓縮每一點性能,那么最好的選擇是使用另一種更快的語言來處理該部分。

但是,我強烈建議您先進行一些詳細的分析。 所有的性能優化都從分析開始,否則很容易做出錯誤的調用並花精力做一些並不能真正提高性能的事情。

您的代碼完全沒有問題。 一般來說,您使用的所有指令都很快,或者更好的是我們無法優化的原子操作。

一個建議,避免一次完全加載文件並“在其上行走”使用生成器,這應該有效地工作:

with open("input.txt", 'r') as f:
    lines = [tuple(line.strip().split()) for line in f]

暗示

如果文件很大並且您無法分解問題,分解輸入數據會非常有效。

一個選項可以是拆分輸入文件、分散計算並將所有結果放在一起。 我發現了一個有趣的實用程序,可用於將問題拆分為更小的部分。

https://pypi.org/project/filesplit/

當您使用 multiprocessing.Pool 有多個輸入時,您可以分配計算。 看看這個例子能不能幫到你

https://superfastpython.com/multiprocessing-pool-example/

暫無
暫無

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

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