AWS Lambda和Python的.pyc文件

25

我试图了解在AWS Lambda中与Python包一起包括.pyc文件的确切影响。

我能找到的极少数参考资料都说不需要将.pyc文件与包一起包含。然而,当我不包含这些文件时,我的Lambda函数的性能会受到严重影响。

尝试将库(例如Jinja2)与我的包一起使用时,如果省略其.pyc文件,则导入jinja2所需的时间总是超过3秒。

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

我发现了这个SO问题,它可能表明AWS Lambda无法保存自己的编译文件,这有道理吗?

我的问题是 - 有没有关于在AWS Lambda上使用Python中.pyc文件的确定信息来源?有没有办法让AWS Lambda保存自己的.pyc文件?还是我应该继续将它们与我的包一起包含?


4
有趣的问题。本能地,我会说 pyc 文件是否存在只应该影响每个 AWS Lambda 容器的初始化,因为之后所有内容都应该保留在 RAM 中。所以我很困惑,你为什么会看到每个请求都有延迟。你是否对性能影响进行了任何结构化测试? - Dunedan
我对导入语句和函数调用进行了隔离和计时,并通过AWS控制台和远程方式进行了测试,包括和不包括pyc文件。结果始终如一。只有在包含pyc文件的情况下,在代码更新后的第一次调用才会变慢,而不包括pyc文件时,反复运行该函数总是需要超过3秒(默认Lambda设置会出现超时错误)。 - danielv
1
由于Lambda在服务器农场上运行,可能每次都在不同的节点上运行,因此预计生成的pyc文件(以及您的代码生成的任何其他文件)将在执行之间被丢弃。因此,如果您注意到在包含编译的Python文件时性能有所改善,我建议您继续在您的软件包中包含它们。 - cristianoms
顺便说一句,这里有一个关于pyc文件存在的问题的好答案(我认为你会觉得很有启发性):https://dev59.com/BnA75IYBdhLWcg3w_ef1#2998544 - cristianoms
@cristianoms 生成pyc文件并不重要,但为了保持一致性,我使用python -m compileall。这个项目目前不大,但预计会不断增长。我知道我可以使用EC2(对于其他项目我已经在使用),但我的问题是关于AWS Lambda的一个特定而令人困惑的问题... - danielv
显示剩余2条评论
1个回答

4

甚至可以只上传.pyc.pyo文件,省略任何依赖项的.py文件(甚至可能省略处理程序,因为您也可以使用Python执行字节码文件,例如python file.pyc)。 - Jann
1
我尝试上传只有 .pyc 文件而没有源文件,但是出现了 ModuleNotFoundError 错误。 - Elliott B
@ElliottB 这则评论已经有一些时日了,但我发现需要将.pyc文件移动才能替换.py文件。此外,我们应该拥有所有的.pyc文件,可以通过python -m compileall .命令获得。 - Avinash Thakur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接