library benchmarks#

results#

GIF animations:

library

runtime (s)

file size (MBs)

enjoyn

39

22

imageio

42

32

moviepy

111

40

ffmpeg

37

255

MP4 animations:

library

runtime (s)

file size (MBs)

enjoyn

15

11

imageio

37

10

moviepy

57

10

ffmpeg

13

10

Tested with MacBook Air (M1, 2020); re-runs may vary slightly.

setup#

[1]:
from enjoyn.example import AirTemperatureExample

example = AirTemperatureExample()
outputs = example.output_images()

gif animation#

enjoyn#

[2]:
from enjoyn import GifAnimator

output_path = "assets/enjoyn_air_temperature.gif"
with example.time_run():
    GifAnimator(items=outputs, output_path=output_path).compute()

example.size_of(output_path)
[########################################] | 100% Completed | 40.5s
Runtime: 40.62840654200045 seconds
File size of enjoyn_air_temperature.gif: 21.96 MBs

imageio#

[3]:
import imageio.v3 as iio

output_path = "assets/imageio_air_temperature.gif"
with example.time_run():
    iio.imwrite(output_path, [iio.imread(output) for output in outputs], loop=0)

example.size_of(output_path)
Runtime: 42.90011516600134 seconds
File size of imageio_air_temperature.gif: 32.19 MBs

moviepy#

[4]:
import moviepy.editor
from moviepy.editor import ImageSequenceClip

output_path = "moviepy_air_temperature.gif"
str_outputs = [str(output) for output in outputs]
with example.time_run():
    clip = ImageSequenceClip(str_outputs, fps=10)
    clip.write_gif(output_path)

example.size_of(output_path)
MoviePy - Building file moviepy_air_temperature.gif with imageio.

Runtime: 116.50619766599993 seconds
File size of moviepy_air_temperature.gif: 40.40 MBs

ffmpeg#

[5]:
import shlex
import subprocess

output_path = "ffmpeg_air_temperature.gif"
for i, output in enumerate(outputs):
    img_path = example._temporary_directory / f"{i:04d}.png"
    img_path.write_bytes(output.read_bytes())

cmd = shlex.split(
    f"ffmpeg -f image2 -framerate 20 "
    f"-i {example._temporary_directory}/%04d.png -y "
    f"-loglevel quiet {output_path}"
)
with example.time_run():
    subprocess.run(cmd)

example.size_of(output_path)
Runtime: 37.32564495900078 seconds
File size of ffmpeg_air_temperature.gif: 255.71 MBs

mp4 animation#

enjoyn#

[7]:
from enjoyn import Mp4Animator

output_path = "enjoyn_air_temperature.mp4"
with example.time_run():
    Mp4Animator(items=outputs, output_path=output_path).compute()

example.size_of(output_path)
[########################################] | 100% Completed | 14.1s
Runtime: 14.224654665998969 seconds
File size of enjoyn_air_temperature.mp4: 11.33 MBs

imageio#

[8]:
import imageio.v3 as iio

output_path = "imageio_air_temperature.mp4"
with example.time_run():
    iio.imwrite(imageio_uri, [iio.imread(output) for output in outputs])

example.size_of(output_path)
Runtime: 30.01758450000125 seconds
File size of imageio_air_temperature.mp4: 10.33 MBs

moviepy#

[9]:
import moviepy.editor
from moviepy.editor import ImageSequenceClip

output_path = "moviepy_air_temperature.mp4"
str_outputs = [str(output) for output in outputs]
with example.time_run():
    clip = ImageSequenceClip(str_outputs, fps=10)
    clip.write_videofile(output_path)

example.size_of(output_path)
Moviepy - Building video moviepy_air_temperature.mp4.
Moviepy - Writing video moviepy_air_temperature.mp4


Moviepy - Done !
Moviepy - video ready moviepy_air_temperature.mp4
Runtime: 51.85272874999828 seconds
File size of moviepy_air_temperature.mp4: 10.33 MBs

ffmpeg#

[10]:
import shlex
import subprocess

for i, output in enumerate(outputs):
    img_path = example._temporary_directory / f"{i:04d}.png"
    img_path.write_bytes(output.read_bytes())

output_path = "ffmpeg_air_temperature.mp4"
cmd = shlex.split(
    f"ffmpeg -f image2 -framerate 1 -r 10 -y "
    f"-i {example._temporary_directory}/%04d.png "
    f"-pix_fmt yuv420p -loglevel fatal {output_path}"
)
with example.time_run():
    subprocess.run(cmd)

example.size_of(output_path)
Runtime: 10.275208666998878 seconds
File size of ffmpeg_air_temperature.mp4: 10.33 MBs