Проблемы с использованием eval () с Cython - PullRequest
4 голосов
/ 07 апреля 2010

Я пытался ускорить некоторый код, а затем я попытался скомпилировать класс и функцию, используя cython

и ВАУ! Я еще не измерял, но он выглядит как минимум в 10 раз быстрее.

Я впервые посмотрел на Cython всего два дня назад, я очень впечатлен!

Однако я не могу заставить eval () работать.

def thefirst(int a):
    d = eval('1+2+a')
    return d

Я компилирую это в файл module1.pyd и вызываю его с помощью файла python:

from module1 import thefirst
x = thefirst(2)
print x

Возвращает:

NameError: имя 'a' не определено.

Вся помощь приветствуется.

Ответы [ 3 ]

7 голосов
/ 07 апреля 2010

Это потому, что eval не может проверить окружение, чтобы найти a. Используйте функцию locals для передачи окружения.

def thefirst(a):
    return eval('1+2+a', locals())
3 голосов
/ 16 апреля 2011

Вы можете обойтись без cython.inline:

http://wiki.cython.org/enhancements/inline

Однако в этом случае следите за использованием памяти во время выполнения Python.Каждое отдельное выражение, которое компилируется и загружается, занимает немного памяти.Это может сложиться, если вы делаете это много.

0 голосов
/ 07 апреля 2010

Хм, я бы подумал, что eval в любом случае будет довольно плох для производительности Каков ваш фактический вариант использования?

...