0

さまざまな L 値でかかる時間を測定する必要があるため、コードを最適化したいと考えています。私がしなければならなかったのは、立方体のボックス (LxLxL) を、同一の直径 d の周期的な点 (x、y、z) で埋めることです。これまでのところ、これは私が持っているものです:

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

アイデアや提案はありますか?前もって感謝します!

4

1 に答える 1

3

いくつかの方法があります。まず、データのフォーマットをデータ生成から分離し、次に、よりクリーンな反復アプローチを使用します。最初の概算では、次のようになります。

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()
于 2012-10-03T06:29:18.200 に答える