我在Python中使用SimuleTK制作了一个模块,我试图通过在C++中实现它来加快速度。结果是慢了很多。在
瓶颈是位移场雅可比行列式滤波器的使用。在
这两个片段给出了过滤器的用法示例。在
1000代:C++=55,Python=8S/P>
我应该期待c++更快吗?在
def test_DJD(label_path, ngen):
im = sitk.ReadImage(label_path)
for i in range(ngen):
jacobian = sitk.DisplacementFieldJacobianDeterminant(im)
if __name__ == '__main__':
label = sys.argv[1]
ngen = int(sys.argv[2])
test_DJD(label, ngen)
以及c++代码
^{2}$我使用的是c++itk4.8.2,在ubuntu15.4上以'release'模式编译。以及python SimpleITK v9.0
您似乎在使用循环进行基准测试。使用循环进行基准测试不是一个好的实践,因为编译器和解释器对它们做了很多优化。在
我相信在这里
python解释器很可能意识到您只使用了分配给
jacobian
变量的最后一个值,因此只执行循环的一次迭代。这是一个非常常见的循环优化。在另一方面,由于您调用C++版本中的两个动态方法(^ {< CD2>}),编译器可能无法推断其他调用没有被使用,C++的版本慢了,因为所有调用都是对DePrimeFieldJiBiangIn行列式:在
另一个可能的原因是,在Python中的Itk管道并没有强制更新,因为您在C++中明确调用了^ {CD3>},但在Python版本中这一点并不明确。在
相关问题 更多 >
编程相关推荐