나는 1500x2000px에서 900x1200px로 이미지의 크기를 조정하는 간단한 함수를 작성했습니다.파이썬 이미징 라이브러리 루프 성능이 반복으로 느려짐
def resizeImage(file_list):
if file_list:
if not os.path.exists('resized'):
os.makedirs('resized')
i = 0
for files in file_list:
i += 1
im = Image.open(files)
im = im.resize((900,1200),Image.ANTIALIAS)
im.save('resized/' + files, quality=90)
print str(i) + " files resized successfully"
else:
print "No files to resize"
일부 예제 이미지로 실행하는 데 걸리는 시간을 측정하기 위해 timeit 함수를 사용했습니다. 다음은 결과의 예입니다.
+---------------+-----------+---------------+---------------+---------------+
| Test Name | No. files | Min | Max | Average |
+---------------+-----------+---------------+---------------+---------------+
| Resize normal | 10 | 5.25000018229 | 5.31371171493 | 5.27186083393 |
+---------------+-----------+---------------+---------------+---------------+
하지만 난이 테스트를 반복하면 시간은 점차 메신저가 테스트를 실행하는 방법이있다
+---------------+-----------+---------------+---------------+---------------+
| Test Name | No. files | Min | Max | Average |
+---------------+-----------+---------------+---------------+---------------+
| Resize normal | 10 | 5.36660298734 | 5.57177596057 | 5.45903467485 |
+---------------+-----------+---------------+---------------+---------------+
+---------------+-----------+---------------+---------------+---------------+
| Test Name | No. files | Min | Max | Average |
+---------------+-----------+---------------+---------------+---------------+
| Resize normal | 10 | 5.58739076382 | 5.76515489024 | 5.70014196601 |
+---------------+-----------+---------------+---------------+---------------+
+---------------+-----------+---------------+---------------+-------------+
| Test Name | No. files | Min | Max | Average |
+---------------+-----------+---------------+---------------+-------------+
| Resize normal | 10 | 5.77366483042 | 6.00337707034 | 5.891541538 |
+---------------+-----------+---------------+---------------+-------------+
+---------------+-----------+---------------+--------------+---------------+
| Test Name | No. files | Min | Max | Average |
+---------------+-----------+---------------+--------------+---------------+
| Resize normal | 10 | 5.91993466793 | 6.1294756299 | 6.03516199948 |
+---------------+-----------+---------------+--------------+---------------+
즉 계속 증가.
def resizeTest(repeats):
os.chdir('C:/Users/dominic/Desktop/resize-test')
files = glob.glob('*.jpg')
t = timeit.Timer(
"resizeImage(filess)",
setup="from imageToolkit import resizeImage; import glob; filess = glob.glob('*.jpg')"
)
time = t.repeat(repeats, 1)
results = {
'name': 'Resize normal',
'files': len(files),
'min': min(time),
'max': max(time),
'average': averageTime(time)
}
resultsTable(results)
기계식 하드 드라이브에서 처리 한 이미지를 SSD로 옮겼지만 문제가 지속됩니다. 나는 또한 사용중인 메모리를 점검했으며, 26Mb 정도의 토큰을 사용하여 CPU의 한 코어의 약 12 %를 사용했다.
앞으로 나는 멀티 프로세싱 라이브러리를 실험하여 속도를 높이고 싶지만, 먼저이 문제의 맨 아래로 들어가고 싶습니다.
성능이 저하되는 루프에 문제가 있습니까?
'im.save()'호출을 제거하면 어떻게됩니까? 나는 감속이 디스크에 반복적으로 기록하기 때문이라고 생각합니다. –
예 디스크 쓰기로 인해 디스크가 느려져서 저장을 제거하면 실제로 실행될 때마다 시간이 늘어납니다. @MartijnPieters이 기능은 멀티 프로세싱 모듈로 가속화하는 것이 적절하다고 생각하십니까? 나는이 질문들을 닫을 것입니다. –
CPU 코어가 여러 개인 컴퓨터가있는 경우 멀티 프로세싱을 사용하면 프로세스 속도가 향상 될 수 있습니다 (각 크기 조정은 별도의 CPU 코어에서 실행 됨). –