所以我有一個帶有屬性的物件串列,但它們可以被視為字典。
所以 category_objects:
category_objects = [{"power": 10, "speed":2, "control":3}, {"power":2, "control":3, "speed":10}, {"power": 5, "control":3, "speed":-10}
還有一個映射到索引的字典。str-> int 索引
CAT_TO_IDX = {"power":0, "speed":1, "control":2}
字典包含更多元素,串列實際上很長。
目前它是通過這種方式完成的:
categories = []
for category_object in category_objects:
cats = []
for c in SASB_CAT_NAME_TO_IDX.keys():
cats.append(getattr(category_object, c))
categories.append(cats)
期望的結果:
categories = [[10, 2, 3], [2,10,3], [5,-10,3]]
所以每個類別物件的值,按照CAT_TO_IDX的順序排列。
我一直在嘗試加速我們操作中慢速部分的矢量化,但我無法弄清楚這一點。我最終得到了這個,它基本上是相同的代碼,并沒有太大的性能提升。希望找到一種方法來矢量化或使用 NumPy 操作快速完成。知道怎么做嗎?
我試過的丑陋的替換代碼..:
def _num_key_apply(self, category_object, keys):
return np.vectorize(category_object.__dict__.get)(keys)
keys = np.array([*CAT_TO_IDX.keys(),], dtype=np.str)
categories = [self._num_key_apply(category_object, keys) for category_object in category_objects]
謝謝!任何指導表示贊賞
uj5u.com熱心網友回復:
既然您提到您已經在使用 Pandas 將這些資料放入資料框中,那么您不妨首先利用 Pandas。您可能不會在性能上大幅提高,但它的步驟更少,這本身就是可維護性的改進:
import pandas as pd
desired_column_order = ["power", "speed", "control"] # etc.
df = pd.DataFrame(category_objects, columns=desired_column_order)
演示:
>>> pd.DataFrame(category_objects, columns=["control", "power", "speed"])
control power speed
0 3 10 2
1 3 2 10
2 3 5 -10
>>> pd.DataFrame(category_objects, columns=["speed", "control", "power"])
speed control power
0 2 3 10
1 10 3 2
2 -10 3 5
>>> pd.DataFrame(category_objects, columns=["power", "speed", "control"])
power speed control
0 10 2 3
1 2 10 3
2 5 -10 3
從這里,您可以對數值資料進行“矢量化”操作,因為 Pandas 由 numpy 陣列支持。但是,加載資料沒有“矢量化”。矢量化依賴于稱為 SIMD 的東西——單指令,多資料——它通過將多個資料加載到暫存器中,然后在整個暫存器上同時執行相同的操作(如“乘以 2”或“取反”)來作業時間。
該np.vectorize()方法是一個美化的for回圈——與標準的 Python 回圈相比,它沒有任何好處for。
uj5u.com熱心網友回復:
defaultdict可以簡化重組:
In [44]: from collections import defaultdict
In [45]: dd=defaultdict(list)
In [47]: for d in category_objects:
...: for k,v in d.items():
...: dd[k].append(v)
...:
In [48]: dd
Out[48]:
defaultdict(list,
{'power': [10, 2, 5], 'speed': [2, 10, -10], 'control': [3, 3, 3]})
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/497792.html
上一篇:如何使用numba?
