严格类型是否会提高Python程序的性能?

3

基于这样的问题,比如什么使得C语言比Python更快?我了解到动态/静态类型并不是C语言比Python更快的主要原因。看起来主要是因为Python程序是解释执行的,而C语言程序是编译执行的。

我想知道,如果采用严格类型检查,能否缩小解释执行与编译执行之间的性能差距,从而成为改善解释执行Python程序性能的一种可行策略?

如果答案是肯定的,在专业开发环境中是否会这样做呢?


不,所有的类型仍然是在运行时动态的。静态类型提示只用于验证源代码本身的“正确性”。 - chepner
那么静态类型是否会产生相反的效果,妨碍Python发挥其作用呢? - Mustafa
@Mustafa,运行时类型检查会增加Python本来就需要执行的工作量。我不会将其描述为“妨碍”,但我预计对性能的任何可衡量影响都将是负面的。 - John Bollinger
2
类型提示在运行时被忽略,除了它们被保留在函数对象的__annotation__属性中。如果在启动时创建这些属性的一次性成本对性能产生负面影响,那么你可能不应该首先使用Python。 - chepner
感谢 @chepner - https://docs.python.org/3/library/typing.html 看起来我本可以发现这里忽略了提示并节省一个主题。感谢帮助! - Mustafa
1个回答

4

当前版本的Python中,类型注解大多是给程序员提供一些提示和可能的验证工具,但编译器忽略了它们,在运行时字节码解释器也不使用它们,这类似于TypeScript的行为。

可能可以改变Python的语义,以利用静态类型在某些情况下生成更高效的字节码,并可能执行即时可执行代码生成(JIT)。先进的JavaScript引擎使用复杂的启发式方法实现此功能,而无需进行类型注释。这两种方法都可以帮助使Python程序更快,并且在某些情况下表现比等效的C代码更好。

还要注意,许多高级的Python软件包使用本地代码,采用C和其他语言编写,利用优化编译器、SIMD指令甚至多线程...使用这些库的程序中的Python代码并不占用时间,而性能与编译语言相当,同时为程序员提供了一个更简单的语言来表达他们的问题。


1
有趣的是,在C语言中,获取“性能”的标准方法也是使用预先优化例程的库。这就是英特尔的MKL/IPL以及其他一些库(如FFTW、Mercury's SAL、VSIPL等)所做的事情。所有C需要做的就是调用这些库并将其传入/传出。这也是为什么在处理器亲和力方面折腾得再多,效果都会很小,尤其是二进制文件可能要在内置操作码集和核心数量变化范围很大的CPU上运行时。我们这些顽固的嵌入式高性能开发人员已经使用库并信任操作系统调度程序几十年了 :-) - bazza
1
在我的领域中,现在存在一个严重的问题,即是否放弃C语言。如今许多科学例程都是为Python编写的;即使最初的Python包是用C语言编写的,也不一定有C语言版本的库。当然,从Python调用包会增加开销,但并不会太多,如果需要的话,向问题投入更多的CPU核心可能总是更方便(特别是对于开发人员)。而且说实话,现代CPU速度非常快,人们正在面临无法利用它们的问题! - bazza

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