我写了这个测试脚本:import numpy as np
import scipy.linalg
n = 130
r = np.array(np.random.normal(size=(n, n)), dtype=np.float32)
e = scipy.linalg.eig(r, left=False, right=False)
print e.mean()
使用IPython运行它,代码总是在几秒钟内成功(我试了十几次)
对于Python,代码总是无法与以下消息聚合(或者只是挂起,对于更大的n)如下
^{pr2}$
是什么解释了Python和IPython在行为上的差异?软件的相关版本为:Ubuntu 12.04,64位
数字1.6.1
SciPy 0.9.0版
Python 2.7.3
IPython 0.12.1版
编辑
我仅以单精度和n >= 130观察到这种行为。如果n = 129,则代码可以在Python和IPython中工作。在
在import后面添加np.random.seed(1234)会得到相同的结果:IPython会收敛,而Python则不会。在
scipy.linalg.__file__ = '/usr/lib/python2.7/dist-packages/scipy/linalg/__init__.pyc'两者都有。尽管如此,我猜IPython和Python会设法引入不同的LAPACK版本,但是如何做到呢?在
我注意到这个奇怪之处的方式是我在IPython中进行试验,然后将代码粘贴到一个用Python运行的*.py文件中。你可以想象我有一段时间有多困惑。在
编辑2。在
np.geterr()在Python和IPython中都是{'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore'}$ ls -l /etc/alternatives/libblas.so
lrwxrwxrwx 1 root root 37 Jun 29 18:21 /etc/alternatives/libblas.so -> /usr/lib/openblas-base/libopenblas.so