javascript - 为什么 Python Lambda 比具有相同功能的 Javascript Lambda 慢得多?
问题描述
我正在使用 AWS 创建一个排序比较工作台来托管排序 lambda。
我有一个在 python (python3.8) 和 javascript (nodejs12.x) lambdas 中实现的冒泡排序算法。两者都分配了 512MB 内存。
当我以 1 到 5500 的数组长度 N 对彼此运行这些时,我得到下图。N 在 x 轴上,在 MS 中所用的时间在 y 轴上:
虽然我预计冒泡排序会很慢,但我没想到 Python 会比 Javascript 慢 100 倍。JS 达到的最大毫秒数约为 120,而 Python 约为 11100。
也许有AWS相关的解释,或者我的实现很慢?
更新: 我将运行时从 CPython 切换到 PyPy,这将运行冒泡排序的时间减少了 x100,图表现在更接近,因此时间差异是由编译器造成的:
解决方案
cpython 和 node 的不同之处在于代码的解释方式:
Python(标准的 cpython)被编译为字节码,然后被解释。所以解释器大部分时间都花在一个包含大开关盒的循环中。(见https://github.com/python/cpython/blob/5f18c223391eef8c7d01241b51a7b2429609dd84/Python/ceval.c#L1622)
node.js(使用 V8)和 PyPy 使用即时编译。这种问题(紧密循环,同构类型)是 JIT 最擅长的:如果解释器发现某些代码经常使用相同的类型运行,JIT 会为其生成并优化本机代码。
推荐阅读
- javascript - React - 从子表单组件更新父状态
- sql - 如何在具有动态列名的一个 select 语句中选择列名和值。
- android - 何时在 Kotlin 中使用属性委托?
- excel - 计算数据透视表中每个日期的行数
- azure-functions - 通过 .net core api 传递一个 json 对象
- postgresql - DBeaver 导入 csv 空字符串作为 NULL 不起作用
- javascript - 从 Firebase 数据库中删除值
- ruby-on-rails - 如何在没有设计的情况下使用 ActiveAdmin 实现自己的身份验证?ActionView::Template::Error: 未定义的方法
- javascript - nan 预测值时 tensorflowjs
- shell - crontab linux中的注释行