matplotlib - scatter 수에 따른 변화

1 분 소요

matplotlib - scatter 수에 따른 변화

  • scatter 에 point를 그릴 때, point의 수가 늘어남에 따라서 그리고 저장하는데 얼마나 시간이 걸리는지 간단하게 테스트 해봤습니다.
  • ‘.svg’ file로 처리했을 경우, 1,000,000 개를 그릴 때, file은 100MBd, 시간은 60초 이상 소요됩니다.
  • 엄밀한 실험을 위해서는 현재 맥북의 리소스 가용도를 테스트 해야하지만, 귀찮으므로 하지 않겠습니다.
scatter_size =      10, time =   0.06 sec, file_size =   0.02 MB
scatter_size =     100, time =   0.05 sec, file_size =   0.02 MB
scatter_size =    1000, time =   0.12 sec, file_size =   0.11 MB
scatter_size =   10000, time =   0.63 sec, file_size =   1.01 MB
scatter_size =  100000, time =   5.78 sec, file_size =   9.98 MB
scatter_size = 1000000, time =  64.28 sec, file_size =  99.69 MB

Wrap-up

  • 물론 filetype에 따라서 달라집니다. png나 다른 이미지로 처리하고, dpi를 조정하면 해결되는 문제이기는 하나, 원본을 그대로 유지하는 선에서 처리하는 것을 목적으로 하기 때문에 svg 파일로만 비교하였습니다.
  • plotting은 여러 분야에서 필요로 하는 기능이지만 사실 꽤나 컴퓨팅 파워를 많이 사용하기도 하고 시간도 꽤 오래 걸리죠.
  • towardsdatascience - plotting in parallel with matplotlib and python를 보면, multiprocessing library를 이용해서 subplot간에 병렬처리하여 plotting 속도를 빠르게 한 경우는 보이는 것 같습니다.
  • scatter의 경우 이미 독립적이기 때문에 multiprocessing module을 이용하여 각자 따로 그려 버릴 수도 있을 것 같습니다. 직접 코딩해볼 수 있을 것 같기는 한데, 늦었으므로 이 또한 다음에 해보겠습니다 하하.

Code

import numpy as np
import matplotlib.pyplot as plt
import time
import os


"""
2022.04.24 - sng_hn.lee - Init
- matplotlib에서 scatter를 처리하고 그림을 저장할 때, 소요되는 시간을 테스트 해봅니다.
---
scatter_size =      10, time =   0.06 sec, file_size =   0.02 MB
scatter_size =     100, time =   0.05 sec, file_size =   0.02 MB
scatter_size =    1000, time =   0.12 sec, file_size =   0.11 MB
scatter_size =   10000, time =   0.63 sec, file_size =   1.01 MB
scatter_size =  100000, time =   5.78 sec, file_size =   9.98 MB
scatter_size = 1000000, time =  64.28 sec, file_size =  99.69 MB
"""

file_type = '.svg'
for n in range(1, 7):
    scatter_size = 10**n
    file_name = f'n_{scatter_size}'
    file_name = file_name + file_type

    # draw figure
    plt.figure()

    xs = np.random.random(scatter_size)
    ys = np.random.random(scatter_size)

    start_time = time.time()
    plt.scatter(x=xs, y=ys)

    plt.savefig(file_name)
    end_time = time.time()
    time_duration = time.time() - start_time

    file_size = os.path.getsize(file_name)
    file_size = file_size / (1024.0 * 1024.0)
    print(f'scatter_size = {scatter_size:7d}, time = {time_duration:6.2f} sec, file_size = {file_size:6.2f} MB')

댓글남기기