[Cython] Cython 0.17 beta 1 released
Yaroslav Halchenko
lists at onerussian.com
Thu Jul 26 04:08:41 CEST 2012
On Wed, 25 Jul 2012, Robert Bradshaw wrote:
> > module = imp.load_dynamic(module_name, module_path)
> > arg_list = [kwds[arg] for arg in arg_names]
> Compiled modules can persist between sessions as well.
yeah -- figured it down also while working on another version of this
trivial patch ;)
> I like your solution of caching the module name, what if we computed
> the module name iff it wasn't in the cache, then compiled the file iff
> the .so file didn't exist (with a check that the module name was OK).
> Alternatively, could we just rename the compiled library to be what we
> expect if it wasn't already?
we could do that ... but altogether -- do you really like caching the
names? imho it is somewhat wasteful for long-running interactive
sessions where people might try different things. Ok -- here is my next
version (stop me eventually) which just does what you wanted -- cache the
ultimate suffix under assumption that it would not change (also removed unused
_code_cache) (it came out a bit longer simply due to me adding helper function
_get_build_extension() to avoid duplication):
--- a/Cython/Build/Inline.py
+++ b/Cython/Build/Inline.py
@@ -29,8 +29,6 @@ if sys.version_info[0] < 3:
else:
to_unicode = lambda x: x
-_code_cache = {}
-
class AllSymbols(CythonTransform, SkipDeclarations):
def __init__(self):
@@ -94,6 +92,16 @@ def safe_type(arg, context=None):
return '%s.%s' % (base_type.__module__, base_type.__name__)
return 'object'
+def _get_build_extension():
+ dist = Distribution()
+ # Ensure the build respects distutils configuration by parsing
+ # the configuration files
+ config_files = dist.find_config_files()
+ dist.parse_config_files(config_files)
+ build_extension = build_ext(dist)
+ build_extension.finalize_options()
+ return build_extension
+
def cython_inline(code,
get_type=unsafe_type,
lib_dir=os.path.join(get_cython_cache_dir(), 'inline'),
@@ -139,8 +147,13 @@ def cython_inline(code,
key = orig_code, arg_sigs, sys.version_info, sys.executable, Cython.__version__
module_name = "_cython_inline_" + hashlib.md5(str(key).encode('utf-8')).hexdigest()
- so_ext = [ ext for ext,_,mod_type in imp.get_suffixes() if mod_type == imp.C_EXTENSION ][0]
- module_path = os.path.join(lib_dir, module_name+so_ext)
+ build_extension = None
+ if cython_inline.so_ext is None:
+ # Figure out and cache current extension suffix
+ build_extension = _get_build_extension()
+ cython_inline.so_ext = build_extension.get_ext_filename('')
+
+ module_path = os.path.join(lib_dir, module_name + cython_inline.so_ext)
if not os.path.exists(lib_dir):
os.makedirs(lib_dir)
@@ -178,23 +191,21 @@ def __invoke(%(params)s):
sources = [pyx_file],
include_dirs = c_include_dirs,
extra_compile_args = cflags)
- dist = Distribution()
- # Ensure the build respects distutils configuration by parsing
- # the configuration files
- config_files = dist.find_config_files()
- dist.parse_config_files(config_files)
- build_extension = build_ext(dist)
- build_extension.finalize_options()
+ if build_extension is None:
+ build_extension = _get_build_extension()
build_extension.extensions = cythonize([extension], ctx=ctx, quiet=quiet)
build_extension.build_temp = os.path.dirname(pyx_file)
build_extension.build_lib = lib_dir
build_extension.run()
- _code_cache[key] = module_name
module = imp.load_dynamic(module_name, module_path)
arg_list = [kwds[arg] for arg in arg_names]
return module.__invoke(*arg_list)
+# Cached suffix used by cython_inline above. None should get
+# overridden with actual value upon the first cython_inline invocation
+cython_inline.so_ext = None
+
non_space = re.compile('[^ ]')
def strip_common_indent(code):
min_indent = None
--
Yaroslav O. Halchenko
Postdoctoral Fellow, Department of Psychological and Brain Sciences
Dartmouth College, 419 Moore Hall, Hinman Box 6207, Hanover, NH 03755
Phone: +1 (603) 646-9834 Fax: +1 (603) 646-1419
WWW: http://www.linkedin.com/in/yarik
More information about the cython-devel
mailing list