可能很明顯,但只是想確認:
對于 pandas 中的數字 ID,最適合的資料型別是什么?
假設我有一個順序數字 ID 型別user_id
,這樣會更好:
- 一個
int64
型別(考慮到欄位的數字表示,這似乎是最明顯的選擇) - 一個
category
型別(這可能更有意義,因為 ID 不是用于實際的數字運算,而是用作唯一識別符號)
object
對于基于字符的 ID,同樣的問題,使用 an還是category
type會更好嗎?
我很想使用category
資料型別(認為可能會有性能優勢,因為我想這些類別會以某種方式優化/散列/索引以提高性能),但我想知道這種資料型別是否更適合更有限的子集與我的資料集中可能擁有的數千個唯一 user_id 不同的值。
謝謝!
uj5u.com熱心網友回復:
對物件型別的資料幀/陣列進行操作很慢,因為 Pandas 需要使用低效的 CPython解釋器對每個專案進行操作。由于參考計數、內部指標間接、型別檢查、內部函式呼叫等,這會導致高開銷。Pandas 經常在內部使用 Numpy,當型別是本機型別時,它會更快,例如int64
, int32
,float64
等。在這種情況下,Numpy 可以執行優化的本機代碼,該代碼不會因 CPython 開銷而減慢,甚至可以從硬體 SIMD 單元中受益(關于使用的目標函式)。雖然 Numpy 支持有界字串,但 Pandas 不使用它,而是使用慢速 CPython 字串物件。字串本來就很慢,即使在本機代碼中,因為它們通常可變的大小通常是可預測的(這強烈影響需要預測分支以便快速的處理器,請參閱這篇關于分支預測的帖子)。在實踐中,unicode 字符使字串變得更慢(這使得 SIMD 指令的使用變得非常困難,并且分支更難以預測)。類別基本上是與(唯一值的)映射表相關聯的整數。對于某些計算,分類列理論上可以更快,因為表已經計算過了。但是,表的初始計算可能很昂貴。此外,該表并不總是有效地使用它有時會導致與整數相比,執行速度出奇地慢。更不用說當所有值都不同時,表格可能會很大。整數是較便宜的型別。較小的整數通常可以更快。實際上,SIMD 向量具有固定大小(例如,86-64 個處理器的 AVX-2 SIMD 指令集可以int8
連續計算 32 個值,而只有 4 個int64
)。此外,較小的專案會導致整個列占用更少的記憶體,從而降低記憶體吞吐量,從而提高記憶體系結代碼的性能(從 Pandas 中非常頻繁的資料幀副本開始)。但是,這并不總是更快,因為較小的型別有時會導致型別轉換增加額外的開銷(盡管可以使用較低級別的優化來減輕這種開銷)。因此,如果您正在處理大型資料幀,請考慮使用小整數型別。否則,int64
肯定是一個很好的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497586.html
標籤:Python python-3.x 熊猫 数据框 表现
上一篇:如何一次解密多條訊息?