繁体   English   中英

在 Numpy 结构化数组中查找值的更快方法

[英]Faster Way to Lookup Values in Numpy Structured Array

在学习使用 Numpy 和 Python 3 创建哈希图时,我想出了以下使用 Numpy 结构化数组data代码。

然而,它需要来选择从一个键对应的值的时间是相当缓慢的,如图中timeit比较13.3秒为numpy的运行结构化阵列data以0.008秒为Python字典d

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

问题的主要来源是像 numpy 和 pandas 这样的查找操作需要检查列表中的每个元素,因为它们也旨在执行多选和更复杂的查找操作。 然而,python 字典只能执行单匹配查找,但它是二叉树的最佳实现。

因此,如果您打算坚持使用密钥访问,我认为您找不到比字典更快的东西。 否则,我会押注 Pandas 以获得最快的访问时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM