Мне удалось получить примерно 35% ускорение за несколько минут с помощью прямого мошенничества: я преобразовал вашу функцию using_split () в модуль Python на основе C, используя cython.Это было первое оправдание, которое мне когда-либо приходилось пробовать на Cython, и я вижу, что это довольно легко и полезно - см. Ниже.
Вставка в C была последним средством: сначала я потратил несколько часов, бездельничаяпытаясь найти более быстрый алгоритм, чем ваша версия using_split ().Дело в том, что нативный python str.split () удивительно быстр, быстрее, чем все, что я пробовал, например, используя numpy или re.Таким образом, даже если вы сканируете строку дважды, str.split () достаточно быстр, что, по-видимому, не имеет значения, по крайней мере, для этих конкретных тестовых данных.
Чтобы использовать Cython, я поместил ваш парсер в файл с именем parser.pyx:
===================== parser.pyx ==============================
def using_split(line):
words = line.split()
offsets = []
running_offset = 0
for word in words:
word_offset = line.index(word, running_offset)
word_len = len(word)
running_offset = word_offset + word_len
offsets.append((word, word_offset, running_offset - 1))
return offsets
===============================================================
Затем я запустил его для установки Cython (при условии, что Debian-ish box для Linux):
sudo apt-get install cython
Затем я вызвал синтаксический анализатор из этого сценария Python:
================== using_cython.py ============================
#!/usr/bin/python
import pyximport; pyximport.install()
import parser
input_string = "ONE ONE ONE \t TWO TWO ONE TWO TWO THREE"
def parse():
return parser.using_split(input_string)
===============================================================
Чтобы проверить, я запустил это:
python -m timeit "import using_cython; using_cython.parse();"
На моем компьютере, ваш чистый PythonФункция using_split () в среднем составляет около 8,5 usec, в то время как моя версия на Cython в среднем составляет около 5,5 usec.
Подробнее на http://docs.cython.org/src/userguide/source_files_and_compilation.html