Numba。如何打开文件

时间:2016-03-05 23:50:27

标签: python numba

我正在使用此功能:

def read_example(water_bound, filename, conditions):

    f = open(filename,"r")
        for i in range(0, conditions):

            lines = f.readline()

            test = map(int, lines.split('            '))

            water_bound.append( test[0]-1 )

我希望能够将其与numba一起使用。据我所知here,我必须在我的函数声明之前添加这一行:

@jit('void(int32[:], c_string_type, int32 )',nopython=True)

但是,我收到了这个错误:

  

NameError:name' c_string_type'未定义

1 个答案:

答案 0 :(得分:3)

你应该看看numba documentation,它解释了支持哪些python功能。这些是nopython模式支持的功能(与python相比实际上加快了速度):

  • 大多数语言结构都是(forif等),包括生成器
  • (差不多)每个数字类型
  • 元组
  • 同类列表
  • 很多数学和numpy的东西

但不支持文件i / o。因此,您需要jit您的功能,但它会以nopython模式失败。

只要分析一下你的功能就会明确表示你不会加速:

  • 文件I / O将回退到python(慢)模式:

    f = open(filename,"r")
    
  • 这个for循环适用于nopypthon模式,因为它受支持(如果循环中的所有内容都可以用numba构造编译):

    for i in range(0, conditions):
    
  • 不幸的是,readline又是文件I / O,不受支持:

        lines = f.readline()
    
  • split之类的字符串操作无法以nopython模式编译:

        test = map(int, lines.split('            '))
    
  • 如果(且仅当)您的列表water_bound仅包含数字,并且您想要附加另一个数字,它应该有效(请参阅numba list reference)但是使用字符串我无法获取它用nopython编译的计算机。

        water_bound.append( test[0]-1 )
    

所以你可以jit你的功能,但是因为它回退到python模式你不需要打扰signatures(因为它们只有在你进入快速时才开始重要nopython模式)很可能你不会看到任何速度优势:

from numba import jit
@jit
def read_example_numba(water_bound, filename, conditions):
    f = open(filename,"r")
    for i in range(0, conditions):
        lines = f.readline()
        test = map(int, lines.split('            '))
         water_bound.append( test[0]-1 )

在我的计算机上带有一些随机生成的文件:

  

使用jit:10000循环,最佳3:78.1 ms每循环
  没有jit:10000循环,最好是每循环3:71.4 ms

你应该看看Numba Documentation Examples他们展示哪种功能可以加速。