【发布时间】:2020-09-04 17:46:52
【问题描述】:
在学习使用 Numpy 和 Python 3 创建哈希图时,我想出了以下代码,它使用了 Numpy 结构化数组 data。
但是,从键中选择值所需的时间非常慢,如 timeit 运行所示,Numpy 结构化数组 data 为 13.3 秒,而 Python 字典 d 为 0.008 秒。
val = data[data['keys'] == key]['values'][0]
有没有更快的方法来获取特定键的项目?
import numpy as np
import timeit
N = 1000*1000
keyArr = np.random.randint(0, 1000*1000*1000*4, N)
valArr = np.random.rand(N)
key = keyArr[0] # Select an existing key value
# Numpy structured array
data = np.empty(keyArr.shape[0], dtype=[('keys', keyArr.dtype), ('values', valArr.dtype)])
data['keys'] = keyArr
data['values'] = valArr
val = data[data['keys'] == key]['values'][0]
print(key, '=>', val) # 558520981 => 0.17948995177905835
print( timeit.Timer("data[data['keys'] == key]['values'][0]",
globals=globals()).timeit(10*1000) , 'secs' ) # 13.256318201000001 secs
# Python built-in dictionary
d = {}
for k, v in zip(keyArr, valArr):
d[k] = v
print(key, '=>', d[key]) # 558520981 => 0.17948995177905835
print( timeit.Timer("d[key]",
globals=globals()).timeit(10*1000) , 'secs' ) # 0.0008061910000000116 secs
Numpy 查找方法 1: 13.3 秒
val = data[data['keys'] == key]['values'][0]
Numpy 查找方法 2: 13.4 秒
val = data['values'][np.where(data['keys'] == key)][0]
pandas.Series:6.8 秒
import pandas as pd
# Pandas Series
s = pd.Series(valArr, index=keyArr, dtype=valArr.dtype)
val = s[key]
print(key, '=>', val)
print( timeit.Timer("s[key]",
globals=globals()).timeit(10*1000) , 'secs' ) # 6.782590246000002 secs
【问题讨论】:
-
你研究过熊猫吗?
-
@RichieV 不,我认为
pandas会比numpy慢,因为它建立在numpy之上并具有附加功能。 -
在正常的 numpy 操作上肯定会慢一些,但它针对这种方法进行了优化,例如使用行/列标签进行过滤
-
@RichieV 好点,让我试试 pandas 并用我的发现更新问题。我猜
pandas.Series会很合适。 -
@RichieV 用
pandas时的结果更新了问题。pandas.Series的查找速度比 numpy 结构化数组快 2 倍,但仍比 Python 的字典慢 1000 倍
标签: python python-3.x numpy data-structures hashmap