Pylibmc, ultramemcache i python-memcached

Wstęp

W ubiegłym roku pisałem o ultrajsonie, który wypadł bardzo dobrze. Przedwczoraj natrafiłem na bibliotekę ultramemcache, którą również postanowiłem przetestować i sprawdzić czy jest ultra.

Do porównania wykorzystam biblioteki python-memcached oraz pylibmc. Pierwszy test odbył się standardowo poprzez odpalenie jednego procesu. Drugi natomiast z wykorzystaniem czterech procesów co znacznie przyspieszyło działanie.

Jeden proces:


python-memcached

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import timeit
from memcache import Client
mc = Client(['127.0.0.1:11211'], debug=0)
def worker():
for s in (str(i) for i in xrange(1000)):
mc.set(s, s.capitalize())
mc.get(s)
mc.incr(s, 1)
mc.decr(s, 1)
t = 0
for _ in xrange(3):
t += timeit.timeit(worker, number=100)
print t / 3

ultramemcache

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import timeit
from umemcache import Client
umc = Client('127.0.0.1:11211')
umc.connect()
def worker():
for s in (str(i) for i in xrange(1000)):
umc.set(s, s.capitalize())
umc.get(s)
umc.incr(s, 1)
umc.decr(s, 1)
t = 0
for _ in xrange(3):
t += timeit.timeit(worker, number=100)
print t / 3

pylibmc

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import timeit
from pylibmc import Client
mc = Client(['127.0.0.1'])
def worker():
for s in (str(i) for i in xrange(1000)):
mc.set(s, s.capitalize())
mc.get(s)
mc.incr(s, 1)
mc.decr(s, 1)
t = 0
for _ in xrange(3):
t += timeit.timeit(worker, number=100)
print t / 3
view raw test_pylibmc.py hosted with ❤ by GitHub

Cztery procesy:


python-memcached

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import timeit
from memcache import Client
from multiprocessing import Process
def worker(x, y):
mc = Client(['127.0.0.1:11211'], debug=0)
for s in (str(i) for i in xrange(x, y)):
mc.set(s, s.capitalize())
mc.get(s)
mc.incr(s, 1)
mc.decr(s, 1)
def test():
process = []
for x, y in ((0, 250), (250, 500), (500, 750), (750, 1000)):
p = Process(target=worker, args=(x, y,))
p.start()
process.append(p)
for p in process:
p.join()
t = 0
for _ in xrange(3):
t += timeit.timeit(test, number=100)
print t / 3

ultramemcache

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import timeit
from umemcache import Client
from multiprocessing import Process
def worker(x, y):
umc = Client('127.0.0.1:11211')
umc.connect()
for s in (str(i) for i in xrange(x, y)):
umc.set(s, s.capitalize())
umc.get(s)
umc.incr(s, 1)
umc.decr(s, 1)
def test():
process = []
for x, y in ((0, 250), (250, 500), (500, 750), (750, 1000)):
p = Process(target=worker, args=(x, y,))
p.start()
process.append(p)
for p in process:
p.join()
t = 0
for _ in xrange(3):
t += timeit.timeit(test, number=100)
print t / 3

pylibmc

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import timeit
from pylibmc import Client
from multiprocessing import Process
def worker(x, y):
mc = Client(['127.0.0.1'])
for s in (str(i) for i in xrange(x, y)):
mc.set(s, s.capitalize())
mc.get(s)
mc.incr(s, 1)
mc.decr(s, 1)
def test():
process = []
for x, y in ((0, 250), (250, 500), (500, 750), (750, 1000)):
p = Process(target=worker, args=(x, y,))
p.start()
process.append(p)
for p in process:
p.join()
t = 0
for _ in xrange(3):
t += timeit.timeit(test, number=100)
print t / 3

Wyniki

Testy wykonałem kilka razy dla każdego ze skryptów i wybrałem najlepsze wyniki dla danej biblioteki.

Był to bardzo prosty test, ale da się zauważyć spore różnice w szybkości działania tych bibliotek. W przypadku jednego procesu ultramemcache poradził sobie najlepiej, chociaż pylibmc jest tuż tuż... Jeżeli chodzi o cztery procesy to pylibmc jest zdecydowanym zwycięzcą.

Zachęcam do robienia swoich testów. Do sporządzenia wykresu skorzystałem z infogr.am. Jedno z lepszych narzędzi do sporządzania infografik z jakich korzystałem.

Update: dodałem testy dla pylibmc.

Comments

Popular posts from this blog

GitLab - extends keyword

Managing Secrets in GitLab / Git

GitLab - trigger keyword