ITK过滤器在C++;比蟒蛇 我在Python中使用SimuleTK制作了一个模块,我试图通过在C++中实现它来加快速度。结果是速度慢了很多

ITK过滤器在C++;比蟒蛇 我在Python中使用SimuleTK制作了一个模块,我试图通过在C++中实现它来加快速度。结果是速度慢了很多,python,c++,itk,Python,C++,Itk,瓶颈是使用置换字段过滤器 这两个片段给出了过滤器使用的示例 1000代:C++=55,Python=8S/P> P>我应该期待C++更快吗?< /P> def测试DJD(标签路径,ngen): im=sitk.ReadImage(标签路径) 对于范围内的i(ngen): 雅可比矩阵=位移场雅可比矩阵行列式(im) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': label=sys.argv[1] ngen=int(sys.argv[2]) 测试_DJD

瓶颈是使用置换字段过滤器

这两个片段给出了过滤器使用的示例

1000代:C++=55,Python=8S/P> <> P>我应该期待C++更快吗?< /P> def测试DJD(标签路径,ngen): im=sitk.ReadImage(标签路径) 对于范围内的i(ngen): 雅可比矩阵=位移场雅可比矩阵行列式(im) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': label=sys.argv[1] ngen=int(sys.argv[2]) 测试_DJD(标签,ngen)

和C++代码< /P>

typedef-itk::向量向量类型;
typedef itk::图像矢量图像类型;
类型定义itk::置换字段Jacobian过滤器JacFilterType;
typedef itk::Image FloatImageType;
int main(int argc,字符**argv){
std::string idealJacPath=argv[1];
std::string numgenstring=argv[2];
国际货币基金组织;
istringstream(NumGenString)>>numGens;
typedef itk::ImageFileReader矢量读取类型;
VectorReaderType::指针读取器=VectorReaderType::New();
reader->SetFileName(idealJacPath);
阅读器->更新();
向量图像类型::指针向量图像=读卡器->获取输出();
JacFilterType::指针jacFilter=JacFilterType::New();
FloatImageType::Pointer generatedJac=FloatImageType::New();
对于(int i=0;iSetInput(矢量图像);
jacFilter->Update();
jacFilter->Modified();
generatedJac=jacFilter->GetOutput();
}
返回0;
}

我使用C++ ITK 4.82.在Ubuntu 15.4的“发布”模式下编译。而PythonSimpleTkV9.0似乎正在使用循环进行基准测试。使用循环进行基准测试不是一种好的做法,因为编译器和解释器对它们进行了大量优化

我相信在这里

for i in range(ngen):
    jacobian = sitk.DisplacementFieldJacobianDeterminant(im)
python解释器很可能意识到您只使用分配给
jacobian
变量的最后一个值,因此只执行循环的一次迭代。这是一个非常常见的循环优化

另一方面,由于您调用C++版本中的一对动态方法(<代码> JavaSoC>Update();),编译器可能无法推断其他调用没有被使用,因为C++调用的版本慢了,因为所有调用都是对DePrimeFieldJoBiIAN行列式:实际上更新了.Update方法。


另一个可能的原因是,在Python中的Itk管道并没有强制更新,因为您在C++中明确地调用了“代码> JavaStudio>修改”(<)/代码>,但是在Python版本中这不是明确的。