如何提高代码性能

3
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
1个回答

1
问题:" ... 有其他方法可以提高代码性能吗...?"

答案:
是的,还有一些方法,但不要指望有什么神奇的效果,因为您已经报告了 API 供应商的限制/阻止更高水平的并发 API 调用。

仍然可能会从一些延迟掩盖技巧中获得一些积极影响,从刚刚的[CONCURRENT]编排多个 API 调用,因为端到端延迟主要是"",需要多次穿越跨越网络的地平线,并且在翻译匹配引擎上也有一些显着的服务器端 TAT 延迟。

详情很重要...

一个性能提升的代码模板,可以开始使用
(避免220k+重复的本地开销附加成本)
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 ) )

性能提升提示:
  • 如果 Google API 政策允许,我们可以增加参与关键段的线程数量;
  • 由于 Python 解释器线程在“内部”相同的地址空间中并且仍然受 GIL 锁互斥阻塞,我们可以通过对不相交的半块迭代器(对于一对线程)或不相交的三分之一块(对于 3 个线程)等进行非重叠的分开操作,以最佳方式处理所有只有 [CONCURRENT] 访问相同 DataFrame 对象的访问;
  • 由于 Google API 政策限制了过度并发访问 API 服务的尝试,您应该内置一些甚至是天真鲁棒性。
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

如果每个线程有更多与时间相关的细节,可以重用this
不要犹豫去调整和优化 - 无论如何,请告诉我们您成功达到的速度,这是公平的,不是吗?

感谢您提供的解决方案。对我来说,解决方案的第一部分似乎很不错。 - Anna
我还需要15个声望才能投票,等我到那时再做。 - Anna
1
享受成长,安娜。 - user3666197

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接