如何提高代码性能(使用Google翻译API)

How to improve code performance ( using Google Translate API )

import time
start = time.time()
import pandas as pd
from deep_translator import GoogleTranslator
    
data = pd.read_excel(r"latestdata.xlsx")
translatedata = data['column']. fillna('novalue')
    
list = []
for i in translatedata:
      finaldata = GoogleTranslator(source='auto', target='english').translate(i)
      print(finaldata)
      list.append(finaldata)
    
df = pd.DataFrame(list, columns=['Translated_values'])
df.to_csv(r"jobdone.csv", sep= ';')
    
end = time.time()

print(f"Runtime of the program is {end - start}")

我有 220k 点的数据并试图转换列数据 起初我尝试使用池方法并行程序但出现错误,我无法一次访问 API 多次。我的问题是是否有其他方法可以提高我现在拥有的代码的性能。

# 4066.826668739319     with just 10000 data all together.
# 3809.4675991535187    computation time when I run in 2 batch's of 5000

Q :
" ... is ( there ) other way to improve performance of code ...? "

A :
是的,有几种方法,
但是不要指望任何神奇的东西,因为你已经报告了 API-provider 的 throttling/blocking 更高水平的并发 API-call 被服务

几个 API-call 的[CONCURRENT] 编排的 latency-masking 技巧仍然可能会产生一些积极影响,因为 End-to-End latencies 主要是“long" many-times 跨越 over-the-"network"-地平线并且在 translation-matching 引擎上也有一些非凡的 server-side TAT-latency。

详情matter, a lot...

性能提升 code-template 从
(避免 220k+ 重复 local-side 开销的 add-on 成本) :

import time
import pandas as pd
from   deep_translator import GoogleTranslator as gXLTe
    
xltDF = pd.read_excel( r"latestdata.xlsx" )['column'].fillna( 'novalue' )
resDF = xltDF.copy( deep = True )

PROC_ns_START = time.perf_counter_ns()
#________________________________________________________ CRITICAL SECTION: start
for                  i in range( len( xltDF ) ):
         resDF.iloc( i ) = gXLTe( source = 'auto',
                                  target = 'english'
                                  ).translate( xltDF.iloc( i ) )

#________________________________________________________ CRITICAL SECTION: end
PROC_ns_END = time.perf_counter_ns()

resDF.to_csv( r"jobdone.csv",
              sep = ';'
              )

print( f"Runtime was {0:} [ns]".format( PROC_ns_END - PROC_ns_START ) )

性能提升技巧:

  • 如果GoogleAPI-policy允许,我们可能会增加thread-count,参与CRITICAL SECTION,
  • 因为 Python-interpreter 线程在同一个 address-space 的“内部”并且仍然是 GIL-lock MUTEX-blocked,我们可以操作所有只是 -[CONCURRENT] 访问到相同的 DataFrame-objects,最好使用 non-overlapping,分开 (thread-private) block-iterators 在分离的一半(对于一对线程)在分离的三分之一(对于 3 个线程)等。 ..
  • 由于 Google API-policy 正在限制对 API-service 的过度并发访问的尝试,您应该 build-in 一些,甚至 naive-robustness
def thread_hosted_blockCRAWLer( i_start, i_end ):
    for i in range( i_start, i_end ):
        while True:
              try:
                  resDF.iloc( i ) = gXLTe( source = 'auto',
                                           target = 'english'
                                           ).translate( xltDF.iloc( i ) )
                  # SUCCEDED
                  break
              except:
                  # FAILED
                  print( "EXC: _blockCRAWLer() on index ", i )
                  time.sleep( ... )
                  # be careful here, not to get on API-provider's BLACK-LIST
                  continue
  • 如果每个线程有更多 time-related 详细信息,可以重复使用 this

不要犹豫,进行调整和调整 - 无论如何,让我们知道您的速度有多快,这很公平,不是吗?