請幫助優化我的python代碼,我撰寫了這個JS代碼并嘗試將其轉換為我需要與原始代碼相當的執行時間的python。
原始代碼遵循 JS 中的 for-loop,我使用純 python 和 numpy 按字面意思傳輸代碼,但我沒有很好地優化它,導致執行時間和記憶體使用不佳。
此代碼以 -10% 的差異計算預設的敵人與玩家的力量并進行隨機擲骰,然后獲得玩家的勝率。目標是將 HERO_POWER 或 ENEMY_POWER 至少設定在 100000-300000 范圍內。
'''
##winchance.js##
Original code
var h = 0
var g = 0
var i = char_power
var l = i*.9
var u = enemy_power * 1.1
var d = enemy_power * .9
for (let e = Math.floor(l); e <= i; e )
for (let t = Math.floor(d); t <= u; t ) e >= t ? h : g
var z = h / (h g)*100;
return z
}
var out = combat_simulate(parseInt(arguments[2]),parseInt(arguments[3]))
console.log(out)
'''
import subprocess,itertools,math
import numpy as np
def calc_iter(array):
w=0
l=0
for x,y in array:
if x >= y:
w =1
else:
l =1
return w,l
###inputs###
HERO_POWER=120000
ENEMY_POWER=110000
w=0
l=0
h_l = HERO_POWER * .9
e_h = ENEMY_POWER * 1.1
e_l = ENEMY_POWER * .9
hp = np.arange(math.floor(h_l),math.floor(HERO_POWER))
ep = np.arange(math.floor(e_l),math.floor(e_h))
print('process using itertools')
start_time = time.time()
array = itertools.product(hp,ep)
w,l = calc_iter(array)
print('win rate:{}%'.format(round((w/(w l))*100,2)))
end_time = time.time()
print('time elapsed',end_time-start_time)
print()
print('process using numpy')
start_time = time.time()
x,y = np.meshgrid(hp,ep)
n = x>y
w,l = (np.count_nonzero(n),np.count_nonzero(n==0))
print('win rate:{}%'.format(round((w/(w l))*100,2)))
end_time = time.time()
print('time elapsed',end_time-start_time)
print()
print('process using nodejs')
start_time = time.time()
result = subprocess.run('node winchance.js {} {}'.format(HERO_POWER,ENEMY_POWER),capture_output=True,text=True)
print('win rate:{}%'.format(round(float(result.stdout),2)))
end_time = time.time()
print('time elapsed',end_time-start_time)
########################################
process using itertools
win rate:68.18%
time elapsed 30.484147787094116
process using numpy
win rate:68.18%
time elapsed 2.0294463634490967
process using nodejs
win rate:68.18%
time elapsed 0.799668550491333
uj5u.com熱心網友回復:
這更簡潔,但它是否更快是由 OP 來衡量的,因為性能可能會因 CPU/OS 以及可能的 Python 版本而異。它也會受到串列中元素數量的顯著影響:
def calc_iter(list_):
w = sum(x >= y for x, y in list_)
return w, len(list_)-w
uj5u.com熱心網友回復:
在網上搜索時,我嘗試使用“numba”來翻譯 python 函式代碼,它顯示了更快的執行速度,在這種情況下我不需要做任何額外的事情。
import math
import numpy as np
import time
import subprocess
import os
from numba import njit
hero_power_list = [120000,130000,140000]
enemy_power_list = [110000,121000,131000]
@njit
def calc_iter_1(array1,array2):
w=0
l=0
for x in array1:
for y in array2:
if x >= y:
w =1
else:
l =1
return w,l
print('process using numba')
for x in range(len(hero_power_list)):
h_l = hero_power_list[x] * .9
e_h = enemy_power_list[x] * 1.1
e_l = enemy_power_list[x] * .9
hp = np.arange(math.floor(h_l),math.floor(hero_power_list[x]))
ep = np.arange(math.floor(e_l),math.floor(e_h))
start_time = time.perf_counter()
w,l = calc_iter_1(hp,ep)
# print('win rate:{}%'.format(round((w/(w l))*100,2)))
end_time = time.perf_counter()
print('time elapsed:',round(end_time-start_time,2),'sec(s)')
print()
print('process using nodejs')
for x in range(len(hero_power_list)):
HERO_POWER = hero_power_list[x]
ENEMY_POWER = enemy_power_list[x]
start_time = time.perf_counter()
result = subprocess.run('node winchance.js {} {}'.format(HERO_POWER,ENEMY_POWER),capture_output=True,text=True)
# print('win rate:{}%'.format(round(float(result.stdout),2)))
end_time = time.perf_counter()
print('time elapsed:',round(end_time-start_time,2),'sec(s)')
########################################
process using numba
time elapsed: 0.87 sec(s)
time elapsed: 0.43 sec(s)
time elapsed: 0.52 sec(s)
process using nodejs
time elapsed: 0.81 sec(s)
time elapsed: 1.07 sec(s)
time elapsed: 1.1 sec(s)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507407.html
標籤:javascript Python 麻木的 迭代工具
上一篇:在Python中準確讀取文本檔案
下一篇:查看登錄用戶的產品