Как ускорить код на Python с модулем segyio - PullRequest
0 голосов
/ 18 февраля 2020

Мой код включает модуль segyio. Мой документ .sgy, который мне нужно обработать, содержит 107591 трасс и 2501 значений на трассу в формате "float32". Я должен обработать входной файл sgy и написать новый обработанный файл sgy. Как я могу ускорить мой код? Может быть, мне стоит использовать jit или Cython, но я не знаю как. Время расчета этого кода около 4-5 часов, это так долго.

...

>  import segyio
>     import statistics
>     import numpy as np
>     import time
>     start_time = time.time()
>     z=int(input('How many traces would you have to change? '))
>     T=int(input('Choose the size of window for averaging '))
>     z1=list(range(z))
>     t1=int(T//4)
>     t=T-t1-t1
>     print('Taken into calculation', t, 'values')
>     t11 = len(range(t1))
>     t0 = ([0.0] * t11)
>     c=np.arange(0, 2502-t)
>     d=np.arange(t, 2502)
>     z2=iter(z1)
>     traces=[]
>     print ('Precycle', "--- %s seconds ---" % (time.time() - start_time))
>     with segyio.open('2M.sgy', 'r') as f:
>         f.mmap()
>         for i in z1:
>             full=[]
>             e=[]
>             z3 = next(z2)
>             a=f.trace[z3]
>             c1 = iter(c)
>             d1 = iter(d)
>             for i in d:
>                     c00 = next(c1)
>                     d00 = next(d1)
>                     e00 = statistics.mean(a[c00:d00])
>                     e.append(e00)
>             full.extend(t0)
>             full.extend(e)
>             full.extend(t0)
>             full=np.array([full], 'float32')
>             traces.append(full)
>             print('Changed trace', z3, "--- %s seconds ---" % (time.time() - start_time))
>         print('Calculation before writing', "--- %s seconds ---" % (time.time() - start_time))
>         spec=segyio.spec()
>         spec.sorting=f.sorting
>         spec.format=f.format
>         spec.samples=f.samples
>         spec.ilines=f.ilines
>         spec.xline=f.xlines
>         spec.tracecount=f.tracecount
>         with segyio.create('2M2.sgy', spec) as dst:
>             dst.mmap()
>             dst.text[0]= f.text[0]
>             dst.bin=f.bin
>             dst.header=f.header
>             dst.trace=traces
>     dst.close()
>     print('End', 'Full calculation time', "--- %s seconds ---" % (time.time() - start_time))

...

...