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

2024-10-05 10:50:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在学习使用Numpy和python3创建hashmap时,我想到了以下代码,它使用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

Tags: 方法keynumpydatanpvalkeysvalues
1条回答
网友
1楼 · 发布于 2024-10-05 10:50:09

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

所以,如果您打算坚持使用密钥访问,我认为您不会比使用字典更快地找到任何东西。否则,我就把赌注押在熊猫身上,争取最快的进入时间

相关问题 更多 >

    热门问题