2016-04-11 22 views
0

書誌データから同様のレコードを持つリストを返すアルゴリズムを実装しました。 BuscarParecidosがあるPython 2.7よりもPython 3よりアルゴリズムの方が遅い

def Find_top(rank,structure, cp): 
    global contadorGrupos 
    global contadorValor 
    datos=[] 
    for clave in rank: 
     aux=[] 
     vectorName=[] 
     if clave["Analizado"]==0: 
      for x in structure: 
       if clave["Name"]!=x["Name"]: 
        if x["Analizado"]==0: 
         jac=jaccard_similarity(clave["Name"],x["Name"]) 
         if jac > 0.4: 
          jar=jellyfish.jaro_winkler(unicode(clave["Name"], 'utf-8'),unicode(x["Name"], 'utf-8')) 
          valor=(jac+jar)/2 
          if valor > 0.5: 
           if cp=="Authors": 
            if valor> 0.8 and Comparador(clave["Name"], x["Name"])==1: 
             if Verificar_Key(clave["Afiliation"], x["Afiliation"])>0.7: 
              aux.append(x) 
              vectorName.append(x["Name"]) 
              x["Analizado"]=1 
           else: 
            if cp == "Afiliation": 
             if valor >= 0.983 : 
              aux.append(x) 
              vectorName.append(x["Name"]) 
              x["Analizado"]=1 
            else: 
             if valor >= 0.93: 
              aux.append(x) 
              vectorName.append(x["Name"]) 
              x["Analizado"]=1 
     clave["Analizado"]=1 
     aux = aux+BuscarParecidos(vectorName,structure, cp) 
     BuscarT(vectorName, rank) 
     if len(aux)!=0: 
      contadorGrupos = contadorGrupos + 1 
      aux.append(clave) 
      datos.append(aux) 
     contadorValor = contadorValor + 1 
    return datos 

def BuscarParecidos(vector, lista , cp): 
    vectorAuxiliar=[] 
    nombres=[] 
    for ax in vector: 
     for i in lista: 
      if i["Analizado"]==0: 
       if not i["Name"] in vector: 
        vx=jaccard_similarity(ax,i["Name"]) 
        vy=jellyfish.jaro_winkler(unicode(ax, 'utf-8'),unicode(i["Name"], 'utf-8')) 
        vt=(vx+vy)/2 
        if cp=="Authors": 
         if vt > 0.8 and Comparador(ax,i["Name"])==1: 
          i["Analizado"]=1 
          vectorAuxiliar.append(i) 
          nombres.append(i["Name"]) 
        else: 
         if cp == "Afiliation": 
          if vt >= 0.983: 
           i["Analizado"]=1 
           vectorAuxiliar.append(i) 
           nombres.append(i["Name"]) 
         else: 
          if vt >= 0.93: 
           i["Analizado"]=1 
           vectorAuxiliar.append(i) 
           nombres.append(i["Name"]) 
    vector = vector + nombres 
    return vectorAuxiliar 

jaccard_similarityは、私自身のアルゴリズムとjaro_winklerはクラゲライブラリで実装されています。

問題は、Python 3.4でアルゴリズムを実行すると、およそ3310レコードで40秒で完全に実行されるということです。しかし、私がPython 2.7でアルゴリズムを実行すると、4分と数秒で終了します。なぜそれが起こるのか分かりません。

+1

可能性のある容疑者は 'ユニコードある - 、utf8'取り扱い、およびのpython3に自生している' generators'(範囲は発電機である)が、あなたのコードをすばやくスキャンしても何もわかりませんでした。 –

+1

@ cricket_007この質問はコードレビューを求めていません。 Python 2.7と3.4の動作上の違いについて具体的に質問しています。これは特定のプログラミングに関する質問であり、したがってSOに属しています(どこにいても)。 – Kaz

+0

アルゴリズムはPython 2.7とPython 3.4の両方で同じように実行されました。エラーコードを除外するためにコードをコピーしました。 –

答えて

-1

はい、私は私がIpythonはあなたがここに最高の幸運 https://www.quora.com/What-is-the-difference-between-IPython-and-Python

になるだろう答えの

ほとんどのアルゴリズムの事のためにはるかに優れていると言うでしょうあまりにも に直面しています。それが遅くなりますので

のpython 2.7を覚えては祖父に似ているが、より堅牢で信頼性の高い

関連する問題