使用類初始化運行回圈非常慢。我需要初始化類 30547200000 行,在當前代碼狀態下這將花費我大約 30 個小時。我需要遍歷這個程序來找到錯誤等。
為什么第二個塊這么慢?即初始化一個類,我能做些什么來讓它更快?注意:我使用的函式的 API 需要一個物件串列。
import dataclasses
import time
import pandas as pd
import numpy as np
# Without class intialization in loop.
df = pd.DataFrame(data={'a': np.arange(4320), 'b': np.arange(4320)})
tmp = list(zip(df.a, df.b))
start_time = time.time()
for _ in range(1000):
a = [(a, b) for a, b in tmp]
print('Without class:', time.time()-start_time)
無課時:0.7349910736083984 秒
# With class intialization in loop.
@dataclasses.dataclass
class SomeClass(object):
a: float
b: float
df = pd.DataFrame(data={'a': np.arange(4320), 'b': np.arange(4320)})
tmp = list(zip(df.a, df.b))
start_time = time.time()
for _ in range(1000):
a = [SomeClass(a=a, b=b) for a, b in tmp]
print('With class:', time.time()-start_time)
帶課時:14.693351745605469 秒
uj5u.com熱心網友回復:
資料類(和一般的類)在 Python 中可能有點慢。您可以嘗試指定__slots__以節省一些記憶體和時間(IIRC 此功能已在某些 Python 版本中從資料類中洗掉,最近又被添加回來,因此如果支持,請更好地檢查您的 Python 版本,并可能考慮切換到常規版本班級)。無論如何,我覺得如果你現在有 30 個小時,你(充其量)會得到幾個小時。可能還是太多了。
請參見此處:https ://docs.python.org/3/reference/datamodel.html#slots
但是——你真的要創造300億個物體嗎?!
我認為(不知道您的用例)更好的解決方案是完全避免創建它們。
例如 - 如果您打算為資料集中的所有行創建一個物件,然后以某種方式處理它們以獲得聚合結果,那么首先計算聚合值然后為該聚合值創建一個物件會更有效。但同樣 - 不知道你的用例,所以很難在這里給出一個好的建議。
uj5u.com熱心網友回復:
Python 不適合撰寫高效的代碼。在 python 中撰寫高效代碼的最好方法是不要用 python 撰寫它。也就是說使用庫。你已經有了 pandas 和 numpy,所以也許我們可以幫助避免這一切,并對其中一個做同樣的事情。
這是撰寫高效python代碼的一些建議
- 回圈很慢。這包括生成器、串列推導和迭代可迭代物件的 lambda 函式。itertools 和 numpy 是你的朋友。如果你可以一起避免回圈,那肯定會更快。
- 上課很慢。無論如何,Python 主要針對函式式編程進行了優化,因此通常有另一種慣用的方式來做同樣的事情,除非你真的是在處理物件。面向資料也適用于此,例如當您創建元組而不是物件時。最有效的是泛型(數字和字串)。拆分資料往往會導致更快的代碼。
- 如果一切都失敗了,請嘗試使用 cython 或 pypy 編譯您的代碼。
uj5u.com熱心網友回復:
有時事情只是很慢?也就是說,NamedTuple 使用類似的語法并減少了初始化時間(雖然它可能會使事情變慢。不同結構的性能對于讀取、寫入等不同)
class SomeClass(NamedTuple):
a: float
b: float
df = pd.DataFrame(data={'a': np.arange(4320), 'b': np.arange(4320)})
tmp = list(zip(df.a, df.b))
start_time = time.time()
for _ in range(1000):
a = [SomeClass(a=a, b=b) for a, b in tmp]
print('With named tuple:', time.time()-start_time)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437073.html
上一篇:C#自啟動類-如何在專案中使用
下一篇:鏈表搜索功能無法正常作業
