gpt4 book ai didi

python - 最快的 Python 等效于整数数组的开关

转载 作者:太空狗 更新时间:2023-10-30 01:23:54 24 4
gpt4 key购买 nike

我想找到用 C 语言完成 switch 工作的最快方法。我正在编写一些 Python 代码来替换 C 代码,除了遇到瓶颈外,一切正常。此代码在紧密循环中使用,因此获得最佳性能确实非常重要。

优化尝试 1:第一次尝试,根据之前的问题,例如 this建议使用哈希表进行查找。这最终变得异常缓慢。

优化尝试 2我进行的另一项优化是创建一系列 if ... return 语句,这使我的速度提高了 13%。它仍然慢得令人失望。

优化尝试 3我创建了一个包含所有可能输入值的 array.array,并进行了索引查找。这导致整体速度提高了 43%,这是可观的。

我正在使用 map 运行 array.array 并将转换函数传递给它。这个函数正在做查找。我的开关正在处理短整数(它是一个类型化数组)。如果这是 GCC C,编译器会创建一个跳转表。令人沮丧的是,Python 要么对我的值进行哈希处理以查找表条目,要么在 if 的情况下执行大量比较。我从分析中知道慢速函数正是进行查找的函数。

将一个整数映射到另一个整数的绝对最快方法是什么,如果相关的话,映射到 array.array 上。有比上面更快的吗?

编辑

虽然这让我看起来像个白痴才刚刚意识到,但我还是要说出来!请记住,在分析器中运行您的代码会减慢您的代码很多。就我而言,慢了 19 倍。突然间我的瓶颈没那么严重了!非常感谢大家的所有回答。这个问题仍然有效。我会暂时搁置这个问题,因为可能会有一些有趣的答案。

使用分析器,对于我的测试数据集:

real    0m37.309s
user 0m33.263s
sys 0m4.002s

没有:

real    0m2.595s
user 0m2.526s
sys 0m0.028s

最佳答案

我认为其他人建议使用 numpy 或 pure c 是正确的;但是对于纯 python,这里有一些时间,它们是值得的。基于这些,我有点惊讶 array.array 的性能比 dict 好得多。您是在循环内动态创建这些表吗?还是我误解了你的问题?无论如何,这表明 list 实际上是最好的方法。

>>> def make_lookup_func(table):
... def lookup(val, t=table):
... return t[val]
... return lookup
...
>>> lookup_tuple = make_lookup_func(tuple(range(10)))
>>> lookup_list = make_lookup_func(list(range(10)))
>>> lookup_array = make_lookup_func(array.array('i', range(10)))
>>> lookup_dict = make_lookup_func(dict(zip(range(10), range(10))))
>>> %timeit lookup_tuple(9)
10000000 loops, best of 3: 177 ns per loop
>>> %timeit lookup_list(9)
10000000 loops, best of 3: 158 ns per loop
>>> %timeit lookup_array(9)
10000000 loops, best of 3: 181 ns per loop
>>> %timeit lookup_dict(9)
10000000 loops, best of 3: 166 ns per loop

缩放行为:

>>> lookup_tuple = make_lookup_func(tuple(range(10000)))
>>> lookup_list = make_lookup_func(list(range(10000)))
>>> lookup_array = make_lookup_func(array.array('i', range(10000)))
>>> lookup_dict = make_lookup_func(dict(zip(range(10000), range(10000))))
>>> %timeit lookup_tuple(9000)
10000000 loops, best of 3: 177 ns per loop
>>> %timeit lookup_list(9000)
10000000 loops, best of 3: 158 ns per loop
>>> %timeit lookup_array(9000)
10000000 loops, best of 3: 186 ns per loop
>>> %timeit lookup_dict(9000)
10000000 loops, best of 3: 195 ns per loop

关于python - 最快的 Python 等效于整数数组的开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8377157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com