python - python中的reversed函数是如何实现的?

标签 python arrays list reverse

我一直在尝试使用元素的就地重新排序来反转 python 中的列表
使用

def reverseArray(a):

    for i in range(int(len(a) / 2)):
        temp = a[i]
        a[i] = a[len(a) - i - 1]
        a[len(a) - i - 1] = temp

    return a

我使用以下脚本来运行基准测试

for s in range(20):
    a = [i for i in range(30002023)]
    tick = time.time()
    reverseArray(a)
    tok = time.time()
    print(f"tok-tick:{tok-tick}")

这给了我以下输出

tok-tick:5.572033643722534
tok-tick:5.721977472305298
tok-tick:6.386164665222168
tok-tick:7.384392738342285
tok-tick:10.91420841217041
tok-tick:7.937604904174805
tok-tick:6.611226320266724
tok-tick:5.531114339828491
tok-tick:6.300005674362183
tok-tick:5.5767083168029785
tok-tick:5.933243274688721
tok-tick:5.885504961013794
tok-tick:5.496972560882568
tok-tick:5.854052543640137
tok-tick:5.983134984970093
tok-tick:5.644777059555054
tok-tick:6.585403680801392
tok-tick:6.760901927947998
tok-tick:5.675948619842529
tok-tick:6.09527063369751

但是 当我使用

使用反向数组函数在同一基准上运行预定义函数时
def reverseArray(a):
    return [ e for e in reversed(a)]

我得到了以下输出

tok-tick:0.9134881496429443
tok-tick:0.922814130783081
tok-tick:0.9020524024963379
tok-tick:0.9431264400482178
tok-tick:0.8796248435974121
tok-tick:0.9475719928741455
tok-tick:0.9039063453674316
tok-tick:0.9342403411865234
tok-tick:0.8823723793029785
tok-tick:0.9073545932769775
tok-tick:0.869114875793457
tok-tick:0.899376630783081
tok-tick:0.8696825504302979
tok-tick:0.9529657363891602
tok-tick:0.8960628509521484
tok-tick:0.9192886352539062
tok-tick:0.9400691986083984
tok-tick:0.9219272136688232
tok-tick:0.8531026840209961
tok-tick:0.9414753913879395

我真的很想知道为什么会有如此巨大的性能差异?

最佳答案

列表更快,因为 list 是内置类型,它的 __reversed__ 方法是 implemented in C ,这当然比普通的 Python 更快。

Python 本身是用 C 语言编写的,解释器执行从您的 Python 代码生成的字节代码。从某种意义上说,这个字节码的每条指令都是一个 C 函数。您可以使用 dis module 检查,您的代码实际上编译为很多指令 - 对 C 的许多调用。但是 list.__reversed__ 在某种程度上是一个 C 函数。调用一个函数当然比调用多个函数更快。

我说“在某种意义上”和“在某种程度上”是因为它实际上并没有一点不同:字节码指令是一个巨大功能的一部分,但实际上并没有什么区别。

关于python - python中的reversed函数是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61819037/

相关文章:

javascript - 在 Javascript 中将字符串转换为二维数组

Python3如何分隔元组中的项目

python - 根据另一列中的值将列添加到 Python pandas DataFrame

python - 使用 crontab 执行脚本时登录 python

python - 与 MATLAB 的 imgaussfilt 相比,为什么使用 skimage 和 scipy 的二维高斯滤波之间的速度差异如此之大?

php - 在数组迭代期间检查当前元素是否是最后一个元素

python - 使用带有 cvxpy 语法的 python-mip 库

python - 使用 python 中数组的索引切片二维数组

android - 无法获取列表 <String> 中已安装应用程序的列表

list - 计算一个数字在列表中出现的次数