2012-10-03 74 views
0

我必須用不同的L值來測量所需的時間,所以我想優化我的代碼。我所要做的是填充一個立方體(LxLxL),其週期點(x,y,z)的直徑d是相同的。到目前爲止,這是我所:重寫這段代碼的有效方法?

L=10 
d=2 

x,y,z = 0,0,0 
counter=0 

with open("question1.xyz","w") as f: 
    while x<=L-d: 
     while y<=L-d: 
      while z<=L-d: 
       f.write('H ') 
       f.write('%f ' %x) 
       f.write('%f ' %y) 
       f.write('%f\n' %z) 
       counter=counter+1 
       z=z+d 
      z=0 
      y=y+d 
     z,y=0,0 
     x=x+d 

然後我必須輸出,這種格式的文件(名爲.xyz文件):

H 0.000000 0.000000 0.000000 
H 0.000000 0.000000 1.000000 
H 0.000000 0.000000 2.000000 
H 0.000000 0.000000 3.000000 
H 0.000000 0.000000 4.000000 

任何意見或建議?提前致謝!

+0

您可以結合寫語句: 'f.write(「H {} {} {} \ n'.format(X,Y,Z) )' – bdforbes

+0

此外,請考慮爲x,y,z元組編寫一個生成器並從中迭代 – bdforbes

+0

您應該檢查您的[問題](http://stackoverflow.com/users/1690243/john-jones?tab=questions )和[接受一些答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work),以便人們將在未來回答你的問題。 – 2012-10-19 09:39:56

回答

3

可以做幾件事情:首先,從數據生成中分離數據格式,其次,使用a cleaner iteration approach。在第一次近似,這將是這樣的:

from itertools import product 

def iterate_3d(size, step=1): 
    """ Generate the data using the standard lib """ 
    # an iterable range between 0 and `size` with `step`, not including size 
    vals = xrange(0, size, step) 

    return product(vals, repeat=3) # replaces your nested loops 


def save(filename, data):  
    """ Format and save the data, which is a sequence of (x, y, z) tuples """ 
    with open(filename, "w") as f: 
     for x, y, z in data: 
      f.write("H %f %f %f\n" % (x, y, z)) 

def main(): 
    data = iterate_3d(10, 2) 
    save("question1.xyz", data) 


if __name__=='__main__': 
    main() 
+0

hm,生成我的文件時遇到問題,你是什麼意思:「」「使用標準庫生成數據」「」 我是python(第一週)的新手,所以仍然試圖學習 – scrayon

+0

這只是一個docsting,它除了評論意圖外別無其他。我使用標準的'產品'功能而不是嵌套循環,就是這樣。你有什麼麻煩? – bereal

+0

感謝您的幫助 沒有什麼特別的錯誤代碼,但文件沒有生成。對不起,如果它是一個noob問題,但我學會創建文件的唯一途徑是通過:打開(「question1.xyz」,「w」)作爲文件:我試着運行你的代碼,但它沒有創建一個.xyz文件 – scrayon

相關問題