Python中索引运算符的快速方法(lambda i:l[i])
给定一个可索引的数据结构,如列表Python中索引运算符的快速方法(lambda i:l[i]),python,micro-optimization,Python,Micro Optimization,给定一个可索引的数据结构,如列表l,我们如何获得与lambda i:l[i]等效的最快函数?lambda函数的问题在于它是Python,会减慢速度。operator模块中有一些内置操作符,但在这种情况下似乎没有一个可以使用 l.\uuu getitem\uuuu的速度是它的两倍多,而且由于这是对象自己的方法,我怀疑你能打败它 >>> timeit('f(i)', 'l=[1,2,3]; i=1; f=lambda i:l[i]', number=10**8) 17.013631
l
,我们如何获得与lambda i:l[i]
等效的最快函数?lambda函数的问题在于它是Python,会减慢速度。operator
模块中有一些内置操作符,但在这种情况下似乎没有一个可以使用 l.\uuu getitem\uuuu
的速度是它的两倍多,而且由于这是对象自己的方法,我怀疑你能打败它
>>> timeit('f(i)', 'l=[1,2,3]; i=1; f=lambda i:l[i]', number=10**8)
17.013631199999963
>>> timeit('f(i)', 'l=[1,2,3]; i=1; f=l.__getitem__', number=10**8)
7.722098399999936
l.\uuu getitem\uuuu
?我想你很难找到比这更快的函数。从技术上讲,您可以使用l.\uuuu getitem\uuuuu
,但我怀疑这样做会更快(当然,对于您可以使用的任何基准测试来说,它都足够接近误差范围),并且调用伪私有方法(名称以两个下划线开头和结尾的方法)是一种不好的做法直接。@mypetlionl.\uuu getitem\uuuu
在我的测试中速度是原来的两倍多,分别是7.5秒和16.3秒(对于1e8调用)。如果您担心速度,那么重复索引列表可能是错误的方法。