0

我有一个用 IDL(交互式数据语言)编写的项目,用于通过同化一堆不同的数据输入来生成电离层的近实时模型。IDL 不是一种很好的语言来编写它,但这主要是因为遗留代码。尽管 IDL 中的对象环境相对有限,但该项目是用 OO 风格编写的。

该项目的下一代范围要大得多,并且需要更多的计算任务。IDL 对多线程的支持有限,不支持在分布式内存系统上并行运行。最初的计划是用 C++ 编写下一代代码,使用 MPI 进行并行化,但是我最近开始学习 Python,并且对易用性以及快速开发和维护代码的能力印象深刻。我现在正在考虑用 Python 编写这个项目的高级部分,并在需要时/如果需要改进核心数字处理部分的优化,则使用 C 扩展。

由于我是 Python 新手,因此我不会立即明白 Python 与 C 版本相比可能会慢的地方(而且在我了解它的特性之前,我也可能在 Python 中做一些次优的事情)。这意味着我会考虑基本上计划整个项目,就好像它是用 Python 完成一样,编写代码,配置文件和反复优化,直到我无法再做任何改进,然后寻找用最慢的部分替换最慢的部分C 扩展。

这是一个好方法吗?有人对开发此类项目有任何提示吗?我将寻求尽可能多地利用现有的优化良好的库(例如 scaLAPACK),这也可以减少为数字运算滚动我自己的基于 C 的扩展的需要。

4

1 回答 1

2

当您执行大量循环时,Python 尤其慢,尤其是嵌套循环

for i in x:
    for j in y:
        ....

当涉及计算密集型问题时,99% 的问题都可以通过使用 numpy 而不是循环进行矢量化计算来解决,例如:

x = np.arange(1000) #numbers from 0 to 999
y = np.arange(1000, 2000) #numbers from 1000 to 1999

# slow:
for i in range(len(x)):
    y[i] += x[i]

# fast:
y += x

对于许多科学问题,有二进制库,用 FORTRAN 或 C(++) 编写,在 Python 中可用。这让生活变得非常轻松。

如果您到了无法做到的地步,我会坚持使用 Cython 轻松实现 C 中的核心部分,而无需编写 C。

于 2013-01-10T11:04:20.533 回答