1

長さのpythonコードをもっとpythonicな方法で書き直すのに苦労しています。これが私が試したことです。最終的なコードをどのように見せたいかの例も含まれています

#!/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)

ここで私を助けてくれませんか?また、シェルを使用して同じことを実装しようとしました。itertoolsしかし、問題はパッケージがないことです。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"
4

2 に答える 2

1

これはあなたが探しているものですか?

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"
于 2013-08-10T11:33:09.370 に答える
1

これを行うPythonicの方法はないと思います。この種の組み合わせの騒乱に深く入り込むと、本質的に読みやすいものを期待することはできなくなります。ただし、これでもかなりコンパクトにできます。最も適切な抽象化の作成は、パターンをどのように一般化するかによって異なり、基礎となる数学をしっかりと理解している必要がある場合があります。(これは私にテンソル積を考えさせますが、私の学部の物理学教育はゆっくりと、しかし確実に私の認知的把握から消えつつあります.生成したすべての組み合わせが一番上にありますが、このようないくつかの関数は、必要な整数のパターンを生成するための出発点になる可能性があります (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
于 2013-08-10T12:28:15.227 に答える