簡體   English   中英

使用python在itertools中使用兩個集合進行排列

[英]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 questiontitle 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM