Pergunta

Estou pensando em mudar meu código (cerca de 30K LOC) do CPython para Jython, de modo que eu pudesse ter uma melhor integração com o meu código java.

Existe uma lista de verificação ou um guia que eu deveria olhar, para ajudar a minha com a migração? Alguém tem experiência em fazer algo semelhante?

Da leitura do Jython local , a maioria dos problemas parecem demasiado obscuro para se preocupar me.

Eu notei que:

  • segurança do thread é uma questão
  • Suporte Unicode parece ser bastante diferente, que pode ser um problema para mim
  • mysqldb não funciona e precisa ser substituído com zxJDBC

Mais alguma coisa?

questão relacionada: Quais são algumas estratégias para código python gravação que funciona em CPython, Jython e IronPython

Foi útil?

Solução 3

Estou começando isto como um wiki coletadas de outras respostas e minha experiência. Sinta-se livre para editar e adicionar coisas, mas por favor, tente furar a conselhos práticos em vez de uma lista de coisas quebradas. Aqui está um velha lista de diferenças da página do Jython.

Gestão de recursos

Jython não usa contagem de referência, e para que os recursos são liberados como eles são lixo coletado, que é muito mais tarde, em seguida, você veria no equivalente programa CPython

  • open('file').read() não fecha o arquivo automaticamente. Melhor usar o idioma with open('file') as fp.
  • O método __ del __ é invocado muito tarde no código Jython, não imediatamente após a última referência para o objeto é excluído.

MySQL Integração

mysqldb é um módulo c, e, portanto, não irá funcionar em Jython. Em vez disso, você deve usar com.ziclix.python.sql.zxJDBC, que vem com Jython.

Substituir o seguinte código MySQLdb:

connection = MySQLdb.connect(host, user, passwd, db, use_unicode=True, chatset='utf8')

Com:

url = "jdbc:mysql://%s/%s?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" % (host, db)
connections = zxJDBC.connect(url, user, passwd, "com.mysql.jdbc.Driver")

Você também precisará substituir todos _mysql_exception com zxJDBC.

Finalmente, você vai precisar para substituir os espaços reservados de consulta de %s para ?.

Unicode

  • Você não pode expressar caracteres Unicode ilegais em Jython. tentar algo como unichr(0xd800) causaria uma exceção, e ter um u'\ud800' literal em seu código vai estragos apenas desabafar.

coisas que faltam

    módulos
  • C não estão disponíveis, é claro.
  • os.spawn * funções não são implementadas. Em vez disso utilização subprocess.call.

Desempenho

  • Para a maioria das cargas de trabalho, Jython será muito mais lento do que o CPython. Os relatórios são qualquer coisa entre 3 a 50 vezes mais lento.

Comunidade

projeto

O Jython ainda está vivo, mas não está em rápido movimento. o dev mailing list tem cerca de 20 mensagens por mês, e parece haver apenas cerca de 2 desenvolvedores cometendo código recentemente.

Outras dicas

Primeiro, eu tenho que dizer que a implementação Jython é muito bom. A maioria das coisas "apenas trabalho".

Aqui estão algumas coisas que eu encontrei:

  • módulos C não estão disponíveis, é claro.

  • open ( 'file'). Read () não fecha automaticamente o arquivo. Isto tem a ver com a diferença do coletor de lixo. Isso pode causar problemas com muitos arquivos abertos. É melhor usar o "com open ( 'file') como fp" idioma.

  • Definir o diretório de trabalho atual (usando os.setcwd ()) trabalha para o código Python, mas não para o código Java. Ele emula o diretório de trabalho atual para relacionadas com o arquivo de tudo, mas só pode fazê-lo por Jython.

  • parsing XML vai tentar validar um DTD externo, se ele estiver disponível. Isso pode causar lentidão maciços em código de manipulação de XML porque o analisador irá baixar o DTD através da rede. I informou esta questão , mas até agora ele permanece unfixed.

  • O método __ del __ é invocado muito tarde no código Jython, não imediatamente após a última referência para o objeto é excluído.

Há um velha lista de diferenças , mas uma recente lista não está disponível.

Até agora, tenho notado mais duas questões:

  • Cordas internar 'a' é 'a' não é garantida (e é apenas um acaso implementação de CPython). Isso pode ser um problema sério, e realmente estava em uma das bibliotecas Eu estava portando (Jinja2). Testes de unidade são (como sempre) seus melhores amigos!
Jython 2.5b0 (trunk:5540, Oct 31 2008, 13:55:41)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
False
>>> 'a' == s   
True
>>> intern('a') is intern(s)
True

Aqui é a mesma sessão em CPython:

Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
True
>>> 'a' == s
True
>>> intern('a') is intern(s)
True

  • os.spawn * funções não são implementadas. Em vez disso use subprocess.call. Fiquei surpreso realmente, como a implementação usando subprocess.call seria fácil, e tenho certeza que eles vão aceitar patches.

(tenho vindo a fazer uma coisa semelhante como você, portar um aplicativo recentemente)

Quando eu mudei um projeto de CPython para Jython algum tempo atrás eu percebi uma velocidade-down de até 50x para seções de tempo crítico. Por causa disso eu fiquei com CPython.

No entanto, isso poderia ter mudado agora com as versões atuais.

Você também pode querer pesquisar JPype . Eu não tenho certeza de como maduro ele é comparado com Jython, mas deve permitir que CPython para acesso ao código Java.

Recentemente, eu trabalhei em um projeto para um professor na minha escola com um grupo. Logo no início, foi decidido que iríamos escrever o projeto em Python. Nós definitivamente deveria ter usado CPython. Nós escrevemos o programa em Python e todos os nossos testes de unidade, eventualmente, trabalhado. Porque a maioria das pessoas já tem Java instalado em seus computadores, e não Python, decidimos apenas implantá-lo como um frasco Jython. Por isso, escreveu o GUI com Swing, porque isso está incluído na biblioteca padrão do Java.

A primeira vez que executou o programa com Jython, que caiu imediatamente. Por um lado, ".fieldnames" do csv.reader sempre parecia estar Nenhum. Por isso eu tive que mudar várias partes do nosso código para o trabalho em torno deste.

A seção diferente do meu código caiu bem, o que funcionou bem com CPython. Jython me acusou de fazer referência a uma variável antes de ter sido atribuído qualquer coisa (o que me deixou maluco e realmente não era o caso). Este é um exemplo: tipo externa da Receita da ActiveState Código

ainda Pior ainda, o desempenho foi horrível. Basicamente, este código combinado vários arquivos CSV, um dos quais era cerca de 2 GB. Em CPython, ele correu em 8,5 minutos. Em Jython, ele correu em 25 minutos.

Estes problemas aconteceu com 2.5.2rc2 (o mais tardar no momento de escrever este post).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top