Reputation: 14990
I have the following program that uses a deque that I copied from the web.
from collections import Counter,deque
import re
import time
import my_ds
num = 100000
def append(c):
for i in range(num):
c.append(i)
def appendleft(c):
if isinstance(c, deque):
for i in range(num):
c.appendleft(i)
else:
for i in range(num):
c.insert(0,i)
def pop(c):
for i in range(num):
c.pop()
def popleft(c):
if isinstance(c,deque):
for i in range(num):
c.popleft()
else:
for i in range(num):
c.pop(0)
for container in [deque, list]:
for operation in [append, appendleft, pop, popleft]:
c = container(range(num))
start = time.time()
operation(c)
elapsed = time.time() - start
print('Completed {0}/{1} in {2} seconds: {3} ops/sec'.format(container.__name__,operation.__name__, elapsed, num/elapsed))
The output looks like below.
Completed deque/append in 0.011004447937011719 seconds: 9087234.595718866 ops/sec
Completed deque/appendleft in 0.00800323486328125 seconds: 12494947.56911344 ops/sec
Completed deque/pop in 0.00800323486328125 seconds: 12494947.56911344 ops/sec
Completed deque/popleft in 0.009003400802612305 seconds: 11106914.175250906 ops/sec
Completed list/append in 0.011004447937011719 seconds: 9087234.595718866 ops/sec
Completed list/appendleft in 8.727489709854126 seconds: 11458.048456601553 ops/sec
Completed list/pop in 0.01900768280029297 seconds: 5261030.555416185 ops/sec
Completed list/popleft in 1.781712532043457 seconds: 56125.776858800775 ops/sec
I am looking for a nice way to align the numbers seconds
and ops/second
.How is this done in pythonI have the following program that uses a deque that I copied from the web.
from collections import Counter,deque
import re
import time
import my_ds
num = 100000
def append(c):
for i in range(num):
c.append(i)
def appendleft(c):
if isinstance(c, deque):
for i in range(num):
c.appendleft(i)
else:
for i in range(num):
c.insert(0,i)
def pop(c):
for i in range(num):
c.pop()
def popleft(c):
if isinstance(c,deque):
for i in range(num):
c.popleft()
else:
for i in range(num):
c.pop(0)
for container in [deque, list]:
for operation in [append, appendleft, pop, popleft]:
c = container(range(num))
start = time.time()
operation(c)
elapsed = time.time() - start
print_list = [container.__name__,operation.__name__, elapsed, num/elapsed]
print(tabulate(print_list, headers = ['Container , Operation , Tile elapsed , ops/sec'], floatfmt=".8f"))
I am getting the following error.
Traceback (most recent call last):
File "C:/playpen/python/concepts/data_structures/collections.py", line 66, in <module>
print(tabulate(print_list, headers = ['Container , Operation , Tile elapsed , ops/sec'], floatfmt=".8f"))
File "C:\Anaconda3\lib\site-packages\tabulate.py", line 894, in tabulate
list_of_lists, headers = _normalize_tabular_data(tabular_data, headers)
File "C:\Anaconda3\lib\site-packages\tabulate.py", line 649, in _normalize_tabular_data
rows = list(map(list,rows))
TypeError: 'float' object is not iterable
Upvotes: 1
Views: 1509
Reputation: 34175
You need to collect all the results and then print them in one go:
print_list = []
for container in [deque, list]:
for operation in [append, appendleft, pop, popleft]:
c = container(range(num))
start = time.time()
operation(c)
elapsed = time.time() - start
print_list.append([container.__name__,operation.__name__, elapsed, num/elapsed])
print(tabulate(print_list, headers = ['Container , Operation , Tile elapsed , ops/sec'], floatfmt=".8f"))
tabulate
takes a list of rows (which should be lists of values). Your old version tried to iterate the numeric result.
Upvotes: 2