【问题标题】:optimization tool优化工具
【发布时间】:2011-12-14 13:38:31
【问题描述】:

我想知道有什么工具可以在循环展开方面优化我的程序,我该如何使用它?

我有以下 python 代码:

for i in range(0, 1000):
       a = a * 10 + a%4 + i
for j in range(0, 1000):
       j = j + a 
for b in range(0, 1000):
      result = j + b

我想优化这个代码段,以便我可以尝试理解循环展开。用Python,我想知道一个C优化器。

【问题讨论】:

  • 您的代码不起作用(a 未定义)。先让它工作,然后优化。
  • 我只是试图显示代码段,而不是全部。如果你想添加一个 = 30
  • 第二个循环可以替换为j = a + 999。第三个是result = j + 999
  • @larsmans 我不认为这是 OP想要 做的事情。

标签: python optimization loops loop-unrolling


【解决方案1】:
a = 30
for i in range ( 0,1000 ) :
    a = a * 10 + a%4 + i

可以改写为:

a = reduce(lambda a,b: a * 10 + a%4 + b, xrange(1000), 30)

大约需要相同的时间(在我的计算机上约为 4 毫秒)。


for j in range ( 0, 1000 ) :
       j = j + a

没有多大意义。您在 0-999 上迭代 j,并且每次都将巨大的 a 添加到其中,这会立即被遗忘,因为下一个 j 会被占用。可以改写为:

j = 999 + a

for b in range ( 0 , 1000 ) :
      result = j + b

也没有多大意义。相当于:

result = j + 999 

【讨论】:

    【解决方案2】:

    如果您对代码的性能不满意,对其进行了分析,并发现像这样的低级循环是一个瓶颈,您应该能够通过使用cython 来大大加快您的代码速度将昂贵的代码位转换为 C 扩展。另外,如果你使用的是 python 2.x,你应该使用xrange 而不是range

    【讨论】:

    • 你能举例说明我如何使用它(cython)
    • 官方文档很好。查看getting started 以获取有关安装cython、构建cython 代码(使用pyximport 是最简单的方法)、从python 调用它以及使用静态类型声明加速代码的说明。 pyximport 的说明是 here
    【解决方案3】:

    有一篇关于 Python 中循环展开效果的科学论文 (pdf link)。 These是相关演讲的幻灯片。

    但是,就自动 C 代码优化而言,您可以将 LLVMLooPo 和可能的 Polly 结合使用。无论如何,LLVM 是一个很好的起点。

    【讨论】:

    • 你能举例说明如何使用它(llvm)
    • 这是一个课程指南:使用 LLVM 从您的 C 代码生成字节码(例如使用 clang -emit-llvm -c foo.c -o foo.o)并使用一个或多个 these 转换通道。结果又是可读的字节码甚至是图形(使用 graphviz 创建)。你可以试一试,但你必须投入一些时间,不要期待奇迹;)
    • 我用 .deb 格式搜索了这个文件,但在 ubuntu 包中找不到任何文件。你在ubuntu中用过吗
    • 你必须自己编译 LLVM。仔细阅读文档。起点是 llvm.org
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多