2015-05-04 9 views
5

Python 3 projelerim çok fazla cython kullanıyor.Cython: pyximport: pyximport uygulamasında profili etkinleştirme.install

üretim dağıtımında, diğer şeyler arasında, profil devre dışı bırakır, bir yapı komut dosyası kullanıyorum: gelişmede

from distutils.core import setup 
from Cython.Build import cythonize 
import os 

compiler_directives = { 
    'language_level': 3, 
    'optimize.use_switch': True, 
    'profile': True, 
} 

setup(
    packages=["XXXXXX"], 
    ext_modules=cythonize(
     module_list="**/*.pyx", 
     compiler_directives=compiler_directives, 
    ) 
) 

, ben pyximport kullanıyorum. İki bağlam arasındaki farkı yapmak için, "üretim" kullanıcısı projenin en üst düzey __init__.py dosyasında kullanılıyorsa test ediyorum. Bu üretim değilse tamamen şeffaf hale böylece ben, pyximport; pyximport.install kullanıyorum:

if getpass.getuser != PRODUCTION_USER_NAME: 
    import pyximport 
    pyximport.install(
     pyximport=True, 
     pyimport=False, 
     build_dir=None, 
     build_in_temp=True, 
     setup_args={}, 
     reload_support=False, 
     load_py_module_on_import_failure=False, 
     inplace=False, 
     language_level=3, 
    ) 

Ben ise geliştirme ortamında tüm Cython dosyalar için profil etkinleştirmek istediğiniz ediyorum. profile=True bağımsız değişkenini piximport.install ifadesine eklemeyi denedim, ancak çalışmıyor.

Nasıl devam edebilirim?

Bazı ek yorumlar:

  • Ben ise gelişiminde tüm kaynak kodları Profile=True iterek ve uygulanıyor önce bunları kaldırmayı önlemek istiyorum ... .pyxbld dosyalarını kullanma

  • bir değil Benim için bir seçenek çünkü 46 pyx dosyasına sahibim ve çok daha fazlasına sahip olmayı planlıyorum ... Yapı senaryosunda yaptığım gibi tüm pyx'leri desteklemek için sadece bir dosya kurmanın bir yolu olmasa da nasıl olduğunu anlamadım.

Yardımlarınız için teşekkürler.

cevap

2

Bu pyximport iç işlevlerinden biridir sarma gerektirir, ancak bu yapılabilir: Bu zorla yeni seçeneklerle değişmeden modülleri yeniden derlemek olmaz

# Allow .pyx files to be seamlessly integrated via cython/pyximport with 
# default compiler directives. 
import functools 
import pyximport.pyximport 

# Hack pyximport to have default options for profiling and embedding signatures 
# in docstrings. 
# Anytime pyximport needs to build a file, it ends up calling 
# pyximport.pyximport.get_distutils_extension. This function returns an object 
# which has a cython_directives attribute that may be set to a dictionary of 
# compiler directives for cython. 
_old_get_distutils_extension = pyximport.pyximport.get_distutils_extension 
@functools.wraps(_old_get_distutils_extension) 
def _get_distutils_extension_new(*args, **kwargs): 
    extension_mod, setup_args = _old_get_distutils_extension(*args, **kwargs) 

    if not hasattr(extension_mod, 'cython_directives'): 
     extension_mod.cython_directives = {} 
    extension_mod.cython_directives.setdefault('embedsignature', True) 
    extension_mod.cython_directives.setdefault('profile', True) 
    return extension_mod, setup_args 
pyximport.pyximport.get_distutils_extension = _get_distutils_extension_new 
pyximport.install() 

Not; Yeni yapılandırma ile bir derlemeyi tetiklemek için bu dosyaları touch'a yapmanız gerekecektir.

2

İşte direktifleri geçirmek için bir görünüşe belgesiz yolu:

pyximport.install(setup_args={ 
    'options': { 
     'build_ext': { 
      'cython_directives': { 
       'language_level': 3, 
       'optimize.use_switch': True, 
       'profile': True, 
      } 
     } 
    } 
}) 

Ben Cython/distutils/build_ext.py içinde cython_directives adını buldum.