如何提高代码性能(使用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。
性能提升 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
不要犹豫,进行调整和调整 - 无论如何,让我们知道您的速度有多快,这很公平,不是吗?
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。
性能提升 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
不要犹豫,进行调整和调整 - 无论如何,让我们知道您的速度有多快,这很公平,不是吗?