2016-03-05 3 views
0

я работаю с этой функцией: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' is not defined

+0

Numba в общем не ускоряет код Python. Вероятно, вы не получите прироста производительности, делая что-то вроде файла IO. Если ваш код работает со скалярными значениями или массивами или, возможно, списками с элементами однородного типа, то numba является фантастическим. То, что вы пытаетесь сделать здесь, вернется к объекту python, который будет иметь такую ​​же скорость, что и python, и, возможно, немного медленнее. – JoshAdel

ответ

2

Вы, вероятно, следует взглянуть на numba documentation, который объясняет которые поддерживаются функциями python. Эти функции, которые поддерживаются в nopython режиме (который на самом деле ускоряет вещи по сравнению с питоном):

  • Большинство языковых конструкций являются (for, if и т.д.), включая генераторы
  • (почти) каждый численный тип
  • кортежи
  • однородные списки
  • много математики и Numpy вещи

, но файл ввода/вывода не поддерживается. Таким образом, вам нужна функция jit, но она не работает с режимом nopython.

Просто анализируя ваши функции будет ясно, что вы не будете получать скорость до: режим (медленный)

  • File I/O будет Откат к питона:

    f = open(filename,"r") 
    
  • Это для цикла будет работать с режимом nopypthon, так как он поддерживается (если все внутри цикла может быть скомпилировано с конструкциями numba):

    for i in range(0, conditions): 
    
  • Unfortunatly Readline снова File 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 вашу функцию, но так как он возвращается в режим питона вам не нужно возиться с 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) 

на моем компьютере с некоторым случайным образом сгенерированный файл он принимает:

With jit: 10000 loops, best of 3: 78.1 ms per loop
Without jit: 10000 loops, best of 3: 71.4 ms per loop

Возможно, вам стоит взглянуть на Numba Documentation Examples, они показывают, какие функции могут ускоряться.

Смежные вопросы