我正在研究一些机器学习代码,今天我因为简单的错字而丢失了大约6个小时。
就是这样:
numpy.empty(100,100)
而不是
numpy.empty([100,100])
由于我不习惯numpy
,所以我忘了括号。代码愉快地捣乱了数字,最后,在将结果保存到磁盘之前,它就崩溃了。
只是为了把事情放在透视中我在shell中的远程机器上编码,所以IDE实际上不是一个选项。我也怀疑IDE会抓住这个。
这是我已经尝试过的:
pylint
- 井pylint有点工作。在我禁用错误和警告之后,它甚至似乎都很有用。但pylint
对导入的模块存在严重问题。正如official bug tracker上所见,开发者知道它,但不能/不会做任何事情。建议的解决方法,但忽略整个模块,在我的情况下无济于事。pychecker
- 如果我使用我犯的错误创建代码段,pychecker
报告错误 - 与python解释器相同的错误。但是,如果我在实际源文件(~100 LOC)上运行pychecker
,它会报告其他错误(未使用的变量,未使用的导入等);但是错过了那条错误的numpy线。最后我尝试了pyflakes
,但它比pychecker / pylint组合的检查更少。
那么有没有可靠的方法可以提前检查代码?没有实际运行它。
答案 0 :(得分:2)
您使用unit tests吗?真的没有更好的方法。
答案 1 :(得分:2)
具有更强类型检查功能的语言可以使您免于此特定错误,但不能避免一般错误。传递静态类型检查有很多方法可以解决。因此,如果您的计算需要很长时间,那么采用以下策略是有意义的:
在小型示例(运行在几秒钟或几分钟内)上端到端测试代码,然后再运行耗费数小时的大数据。
构建长时间运行的计算,以便将中间结果保存到计算中适当位置的磁盘上的文件中。这意味着当出现问题时,您可以解决问题并从上一个保存点重新开始计算。
运行交互式解释器中的代码,以便在发生异常时返回到交互式会话,使您有机会使用事后调试会话恢复数据。例如,假设我有一些长时间运行的计算:
def work(A, C):
B = scipy.linalg.inv(A) # takes a long time when A is big
return B.dot(C)
我从交互式解释器运行它,它引发了一个异常:
>>> D = work(A, C)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "q22080243.py", line 6, in work
return B.dot(C)
ValueError: matrices are not aligned
哦不!我忘了转置C
!我是否必须再次进行A
的反转?如果我拨打pdb.pm
:
>>> import pdb
>>> pdb.pm()
> q22080243.py(6)work()
-> return B.dot(C)
(Pdb) B
array([[-0.01129249, 0.06886091, ..., 0.08530621, -0.03698717],
[ 0.02586344, -0.04872148, ..., -0.04853373, 0.01089163],
...,
[-0.11463087, 0.15048804, ..., 0.0722889 , -0.12388141],
[-0.00467437, -0.13650975, ..., -0.13894875, 0.02823997]])
现在,与Lisp不同,我不能只是设置正确并继续执行。但至少我可以恢复中间结果:
(Pdb) D = B.dot(C.T)
(Pdb) numpy.savetxt('result.txt', D)