[英]permutation with two sets in itertools using python
我在以更多Pythonic方式重寫長度python代碼時遇到了麻煩。 這是我嘗試過的內容,還包含一個示例,說明我如何使最終代碼看起來像
#!/usr/bin/env python
import time
import itertools
import os
freq = [2400000,2000000,1600000,1200000,800000]
freq_set = [
[ i for i in itertools.combinations(freq,1)],
[ i for i in itertools.combinations(freq,2)],
[ i for i in itertools.combinations(freq,3)],
[ i for i in itertools.combinations(freq,4)]
]
cores = [[0,4],[1,5],[2,6],[3,7]]
sets = [[0,4],[0,4,1,5],[0,4,1,5,2,6],[0,4,1,5,2,6,3,7]]
# 5 10 10 5 ; 1 3 5 7
for freq_set_val in range(0, len(freq_set)):
if freq_set_val == 0:
change = "echo "+ freq_set[freq_set_val][0] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][0] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
print "do something"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
print "do something"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
print "do something"
change = "echo "+ freq_set[freq_set_val][3] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][3] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
print "do something"
change = "echo "+ freq_set[freq_set_val][4] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][4] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
print "do something"
if freq_set_val == 1:
change = "echo "+ freq_set[freq_set_val][0] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][0] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][2] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][3] + "/cpufreq/scaling_setspeed"
print "do something"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][2] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][3] + "/cpufreq/scaling_setspeed"
print "do something"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][3] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][2] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][3] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][3] + "/cpufreq/scaling_setspeed"
print "do something"
print "so onn"
if freq_set_val == 2:
change = "echo "+ freq_set[freq_set_val][0] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][0] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][0] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][1] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][2] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][1] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][3] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][4] + "/cpufreq/scaling_setspeed"
change = "echo "+ freq_set[freq_set_val][2] +"> /sys/devices/system/cpu/cpu"+ sets[freq_set_val][5] + "/cpufreq/scaling_setspeed"
print "do something"
本質上,我想繼續翻轉具有特定頻率水平的一組核心。 因此,在每次change
聲明之后。 我會寫os.system(change)
你能幫我嗎? 我也嘗試使用shell來實現相同的功能。 但問題是沒有itertools
軟件包。 請隨時更改我不知道該如何措辭title of question
的title of question
。
這就是現在的樣子。 漂亮的版本總是更好:)但我不知道如何增強它
for freq_set_val in range(0, len(freq_set)):
if freq_set_val == 0:
for freq in range(0, len(freq_set[freq_set_val])):
for val in range(0, len(freq_set[freq_set_val][freq])):
change = "echo "+ str(freq_set[freq_set_val][freq][val]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][0]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][val]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][1]) + "/cpufreq/scaling_setspeed"
print "do something"
if freq_set_val == 1:
for freq in range(0, len(freq_set[freq_set_val])):
change = "echo "+ str(freq_set[freq_set_val][freq][0]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][0]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][0]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][1]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][1]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][2]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][1]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][3]) + "/cpufreq/scaling_setspeed"
print "do something"
if freq_set_val == 2:
for freq in range(0, len(freq_set[freq_set_val])):
change = "echo "+ str(freq_set[freq_set_val][freq][0]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][0]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][0]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][1]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][1]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][2]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][1]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][3]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][2]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][4]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][2]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][5]) + "/cpufreq/scaling_setspeed"
print "do something"
if freq_set_val == 3:
for freq in range(0, len(freq_set[freq_set_val])):
change = "echo "+ str(freq_set[freq_set_val][freq][0]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][0]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][0]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][1]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][1]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][2]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][1]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][3]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][2]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][4]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][2]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][5]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][3]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][6]) + "/cpufreq/scaling_setspeed"
change = "echo "+ str(freq_set[freq_set_val][freq][3]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][7]) + "/cpufreq/scaling_setspeed"
print "do something"
這是你想要的?
def change_freq(freq_set, freq_set_val, freq, i1, i2):
change = "echo "+ str(freq_set[freq_set_val][freq][i1]) +"> /sys/devices/system/cpu/cpu"+ str(sets[freq_set_val][i2]) + "/cpufreq/scaling_setspeed"
# os.system(change)
for freq_set_val in range(0, len(freq_set)):
for freq in range(0, len(freq_set[freq_set_val])):
for i in range(0, (freq_set_val+1)*2):
change_freq(freq_set, freq_set_val, freq, i/2, i)
if freq_set_val == 0:
print "dosomething"
if freq_set_val == 1:
print "dosomething"
if freq_set_val == 2:
print "dosomething"
if freq_set_val == 3:
print "dosomething"
我真的不認為有Python方式可以做到這一點。 一旦您深入到這種組合混亂中,您就無法希望獲得本質上可讀的內容。 但是,這仍然可以做得相當緊湊。 創建最合適的抽象將完全取決於您打算如何概括模式,並且可能需要對基礎數學有深入的了解。 (這讓我想到了張量積,但是我的本科物理教育正在緩慢但必定會從我的認知能力中逐漸消失……)我無法從您的示例中確切看出您希望每個序列在哪里結束或您是否打算使用每個生成的組合都在頂部,但是像這樣的幾個函數可能是生成所需整數模式的起點(Python 2.7):
def repeating_range(start, stop, repeat):
return reduce(add,itertools.izip(*itertools.tee(xrange(start,stop),repeat)))
def collated_repeating_range(grouping, stop, repeat):
return reduce(add,reduce(add,itertools.izip((repeating_range(start, start+grouping, repeat)
for start in xrange(stop)))))
for freq_set_val in range(0, len(freq_set)):
offset = freq_set_val+1
for pair in itools.izip(collated_repeating_range(offset,5,2), itools.cycle(xrange(offset*2))):
print pair
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.