Ich verwende einen eingebetteten Python 2.7 Interpreter in meinem C++ Projekt, und ich möchte den Interpreter so viel wie möglich optimieren. Eine Möglichkeit, dies zu tun, besteht darin, meine Debug-Anweisungen mit der __debug__
-Variable zu deaktivieren. Ich möchte auch mögliche Leistungssteigerungen aufgrund der Ausführung von Python mit Bytecode-Optimierungen (d. H. Dem -O
-Flag) erkennen.Wie kann ich einen eingebetteten Python-Interpreter mit Bytecode-Optimierung aus C++ initialisieren?
This Stack Overflow question Adressen die Verwendung der __debug__
Variable, und stellt fest, dass es durch Ausführen von Python mit -O
deaktiviert werden kann. Dieses Flag kann jedoch offensichtlich nicht für einen eingebetteten Interpreter übergeben werden, der mit C++ - Hooks erstellt wird.
Unten ist mein eingebetteter Interpreter-Initialisierungscode. Der Code soll nicht isoliert ausgeführt werden, sondern sollte einen Einblick in die Umgebung geben, die ich verwende. Gibt es eine Möglichkeit, diese Funktionsaufrufe zu ändern oder zu ergänzen, um festzulegen, dass der eingebettete Interpreter Bytecode-Optimierungen anwenden soll, die Variable __debug__
auf False
setzen und im Allgemeinen im "release" -Modus statt im "debug" -Modus laufen soll?
void PythonInterface::GlobalInit() {
if(GLOBAL_INITIALIZED) return;
PY_MUTEX.lock();
const char *chome = getenv("NAO_HOME");
const char *cuser = getenv("USER");
string home = chome ? chome : "", user = cuser ? cuser : "";
if(user == "nao") {
std::string scriptPath = "/home/nao/python:";
std::string swigPath = SWIG_MODULE_DIR ":";
std::string corePath = "/usr/lib/python2.7:";
std::string modulePath = "/lib/python2.7";
setenv("PYTHONPATH", (scriptPath + swigPath + corePath + modulePath).c_str(), 1);
setenv("PYTHONHOME", "/usr", 1);
} else {
std::string scriptPath = home + "/core/python:";
std::string swigPath = SWIG_MODULE_DIR;
setenv("PYTHONPATH", (scriptPath + swigPath).c_str(), 1);
}
printf("Starting initialization of Python version %s\n", Py_GetVersion());
Py_InitializeEx(0); // InitializeEx(0) turns off signal hooks so ctrl c still works
GLOBAL_INITIALIZED = true;
PY_MUTEX.unlock();
}
void PythonInterface::Init(VisionCore* core) {
GlobalInit();
PY_MUTEX.lock();
CORE_MUTEX.lock();
CORE_INSTANCE = core;
thread_ = Py_NewInterpreter();
PyRun_SimpleString(
"import pythonswig_module\n"
"pythonC = pythonswig_module.PythonInterface().CORE_INSTANCE.interpreter_\n"
"pythonC.is_ok_ = False\n"
"from init import *\n"
"init()\n"
"pythonC.is_ok_ = True\n"
);
CORE_MUTEX.unlock();
PY_MUTEX.unlock();
}