nuovo rilascio del layer , che consente l'accesso completo delle applicazioni Python alle librerie di classi in Java. Grazie a JPype, da Python è possibile utilizzare librerie specifiche per Java, creando applicazioni ibride che combinano codice Java e Python. A differenza di Jython, l'integrazione con Java avviene non attraverso la creazione di una variante di Python per la JVM, ma attraverso l'interazione a livello di entrambe le macchine virtuali, utilizzando memoria condivisa. L'approccio proposto consente non solo di ottenere buone prestazioni, ma fornisce anche accesso a tutte le librerie CPython e Java. Il codice del progetto sotto licenza Apache 2.0.
Variazioni principali:
- È stata aggiunta una cache alle chiamate ai metodi per evitare la risoluzione dei sovraccarichi, il che riduce notevolmente l'impatto sulle prestazioni della risoluzione dei metodi, specialmente se lo stesso sovraccarico viene chiamato molte volte, come durante l'esecuzione dei cicli.
- La trasmissione di liste, tuple e buffer in array di primitive Java è stata accelerata da 4 a 100 volte, a seconda del tipo di dati. La conversione utilizza un'elaborazione ottimizzata dei buffer in memoria, invece del Sequence API. Quando si incontra un buffer Python, solo il primo elemento viene verificato per la conversione, poiché i buffer di dati sono omogenei.
- La gestione delle operazioni di arresto (implementata sin da JPype 1.0.0, ma omessa nella preparazione dell'elenco delle modifiche). JPype ora chiama la procedura di arresto della JVM, che cerca di eseguire l'uscita in modo "gracefully". Questo porta a diversi cambiamenti nel comportamento. I thread non in background (chiamata proxy) possono ora mantenere la JVM aperta fino a quando non vengono completati. Le chiamate Proxy gestiranno l'arresto fino a quando la chiamata non sarà completata, ma riceveranno un messaggio di interruzione. I file ora si chiudono correttamente e i dati vengono scritti su disco (flush), se i thread gestiscono l'eccezione in modo appropriato. Vengono eseguite le pulizie delle risorse e i finalizzatori. Quando vengono generati thread, vengono chiamati i hook AtExit. Si implementa un joining automatico dei thread tramite il demone quando si utilizza la JVM da Python. Il codice problematico che non può gestire correttamente la pulizia del thread probabilmente si bloccherà durante l'arresto. Ulteriore documentazione è disponibile nella guida all'uso.
- Il wrapper per Throwable riceveva un wrapper per Object invece del risultato atteso, portando a strane conversioni da classi Python.
- Correzioni di typo nel sistema di importazione che portavano all'errore ‘»jname» non trovato’.
- Corretto il passaggio di «^C» in KeyboardInterrupt.
- Risolto un problema con i simboli da Python 3.5.3. PySlice_Unpack è stato introdotto nella successiva versione patch (3.5.4) e non doveva essere utilizzato.
- Analizzato un errore con numpy.linalg.inv che portava a un crash. Il problema è stato rintracciato all'interazione dei thread tra la JVM e alcune versioni di numpy. La soluzione consigliata è di chiamare numpy.linalg.inv prima di avviare la JVM.
Fonte: opennet.ru
