AWS Lambda和Python';pyc文件

AWS Lambda和Python';pyc文件,python,performance,aws-lambda,Python,Performance,Aws Lambda,我试图理解在AWS Lambda中包含.pyc文件和Python包的确切效果 在这方面,我能找到的很少的参考资料表明,没有必要在包中包含.pyc文件。然而,当我不包含这些文件时,我发现Lambda函数的性能受到了巨大的影响 试图在我的软件包(例如Jinja2)中包含一个库时,如果省略它的.pyc文件,导入Jinja2所需的时间总是超过3秒 当我提供.pyc文件时,第一次执行仍然需要3秒钟,但在那之后,它会下降到100-200毫秒(我猜直到函数最终卸载?) 我发现这可能表明AWS Lambda无法

我试图理解在AWS Lambda中包含.pyc文件和Python包的确切效果

在这方面,我能找到的很少的参考资料表明,没有必要在包中包含.pyc文件。然而,当我不包含这些文件时,我发现Lambda函数的性能受到了巨大的影响

试图在我的软件包(例如Jinja2)中包含一个库时,如果省略它的.pyc文件,导入Jinja2所需的时间总是超过3秒

当我提供.pyc文件时,第一次执行仍然需要3秒钟,但在那之后,它会下降到100-200毫秒(我猜直到函数最终卸载?)

我发现这可能表明AWS Lambda无法保存自己编译的文件,这有意义吗


我的问题是-关于AWS Lambda上Python使用.pyc文件的情况,是否有明确的信息来源?有没有办法让AWS Lambda保存自己的.pyc文件?或者我应该继续将它们包含在我的包中吗?

我不这么认为,
.pyc
文件是一个Python解释器编译源代码然后执行此代码的文件。 考虑到这一点,我们可以控制“python虚拟机运行”应该运行哪些文件

我认为最好的解决方案就像你说的:

只要继续把它们包括在我的包裹里就行了


一旦您这样做,代码执行器就已经有了您的字节码文件。

有趣的问题。本能地,我会说,如果
pyc
,文件是否存在,应该只对每个AWS Lambda容器的初始化起作用,因为之后所有内容都应该保存在RAM中。所以我很困惑,你看到了每个请求的延迟。您是否做过关于性能影响的结构化测试?嗯,我隔离并定时记录导入语句,并通过AWS控制台和远程调用该函数,无论是否使用pyc文件。结果总是一样的。对于pyc文件,仅在代码更新后的第一次调用速度较慢,而不包括pyc文件,反复运行函数的时间总是超过3秒(默认Lambda设置会导致超时错误)。由于Lambda在服务器场上运行,每次都可能在不同的节点上运行,在执行之间,生成的pyc文件(以及代码生成的任何其他文件)将被丢弃。因此,如果您在包含已编译的Python文件时注意到性能的提高,我建议您继续将它们包含在包中。@cristianoms是的,我现在可以包含它们,但zip文件变大,上载时间变慢,因此我想知道这种行为的原因是什么,是否有更好的方法。除了在建议排除它们的少数地方之外,找不到关于这方面的很多提及。我有一些问题可以帮助我更好地了解您的情况:您是如何生成pyc文件的?您正在使用某种构建工具吗?这个项目有多大?编译后的文件是否会使生成的zip文件的大小急剧膨胀?也许您应该在自己的ec2实例上运行代码,而不是在lambda上运行代码。您甚至可以上载
.pyc
.pyo
文件,并忽略
.py
文件以获取任何依赖项(即使处理程序也可能会执行字节码文件,例如,
python file.pyc
)我尝试只上载
.pyc
文件,而不上载源代码,但由于ModuleNotFoundError而失败