Кэширование скомпилировало объекты regex в Python?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

19
задан eLRuLL 16 December 2017 в 23:08
поделиться

7 ответов

это возможный сохранить эти регулярные выражения в кэше на диске предварительно скомпилированным способом, чтобы избежать необходимости выполнять regex компиляции на каждом импорте?

Не легко. Необходимо было бы записать пользовательский сериализатор, который сцепляет в реализацию C sre Python regex механизм. Любые выигрыши в производительности были бы значительно перевешены к этому времени и требуемое усилие.

Первый, Вы на самом деле представили код? Я сомневаюсь, что компиляция regexes является значительной частью времени выполнения приложения. Помните, что они только компилируются в первый раз, когда модуль импортируется в текущем выполнении - после этого, модуль и его атрибуты кэшируются в памяти.

, Если у Вас есть программа, которая в основном мечет икру однажды, компилирует набор regexes и затем выходит, Вы могли попробовать реинжиниринг он для выполнения нескольких тестов в одном вызове. Затем Вы могли снова использовать regexes, как выше.

Наконец, Вы могли скомпилировать regexes в конечные автоматы на базе С и затем связать их в с дополнительным модулем. В то время как это, вероятно, было бы более трудно поддержать, это устранит regex компиляцию полностью из Вашего приложения.

13
ответ дан 30 November 2019 в 05:04
поделиться

В первую очередь, это - четкое ограничение в модуле ре Python. Это вызывает предел, сколько и как большие регулярные выражения разумны. Предел больше с длительными процессами и меньше с недолгими процессами как приложения командной строки.

Несколько лет назад я действительно смотрел на него, и возможно откопать результат компиляции, засолить его и затем не засолить его и снова использовать его. Проблема состоит в том, что это требует использования sre.py внутренностей и так не будет, вероятно, работать в различных версиях Python.

я хотел бы иметь этот вид функции на моей панели инструментов. Я также хотел бы знать, если существуют какие-либо отдельные модули, которые могли бы использоваться вместо этого.

2
ответ дан 30 November 2019 в 05:04
поделиться

Обратите внимание, что каждый модуль инициализирует себя только однажды во время жизни приложения, неважно, сколько раз Вы импортируете его. Таким образом, если Вы компилируете свои выражения в глобальной области видимости модуля (т.е. не в функции) необходимо быть в порядке.

3
ответ дан 30 November 2019 в 05:04
поделиться

Эти откладывают , модуль, кажется, работает просто великолепно:


import re
import shelve
a_pattern = "a.*b"
b_pattern = "c.*d"
a = re.compile(a_pattern)
b = re.compile(b_pattern)

x = shelve.open('re_cache')
x[a_pattern] = a
x[b_pattern] = b
x.close()

# ...
x = shelve.open('re_cache')
a = x[a_pattern]
b = x[b_pattern]
x.close()

можно затем сделать хороший класс обертки, который автоматически обрабатывает кэширование для Вас так, чтобы это стало очевидным для пользователя... осуществление, оставленное читателю.

0
ответ дан 30 November 2019 в 05:04
поделиться

Откройте/usr/lib/python2.5/re.py и ищите "определение _compile". Вы найдете внутренний механизм кэширования re.py.

0
ответ дан 30 November 2019 в 05:04
поделиться

Возможно поместить каждый regex (или группа regexs) в отдельный файл и затем динамично импортировать файл, что Вам нужно использование модуля импорта. Я сомневаюсь, что это масштабируется очень хорошо, но это могло быть тем, в чем Вы нуждаетесь.

-1
ответ дан 30 November 2019 в 05:04
поделиться

Гул,

не откладывает рассол использования?

Так или иначе, я соглашаюсь с предыдущим anwsers. Так как модуль обрабатывается только однажды, я сомневаюсь, что компиляция regexps будет Вашим горлышком бутылки приложения. И модуль ре Python является злым быстро, так как он кодируется в C :-)

, Но хорошие новости - то, что Python получил хорошее сообщество, таким образом, я уверен, что можно найти кого-то в настоящее время взламывающего, в чем Вы нуждаетесь.

я погуглил 5 секунд и нашел: http://home.gna.org/oomadness/en/cerealizer/index.html .

не знают, сделает ли это это, но в противном случае удача в Вас исследование :-)

-1
ответ дан 30 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: