Skip to content

Commit aed7d7f

Browse files
committed
io: Speedup write_data
Assemble column formatters beforehand, avoid inline logic deciding the correct format for every cell value.
1 parent 0f84885 commit aed7d7f

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

Orange/data/io.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from importlib import import_module
1414
from itertools import chain, repeat
1515
from math import isnan
16-
from numbers import Number
16+
1717
from os import path, remove
1818
from tempfile import NamedTemporaryFile
1919
from urllib.parse import urlparse, urlsplit, urlunsplit, unquote as urlunquote
@@ -805,15 +805,28 @@ def write_data(cls, write, data):
805805
data.domain.attributes,
806806
data.domain.class_vars,
807807
data.domain.metas))
808+
809+
def formatter(var):
810+
# type: (Variable) -> Callable[[Variable], Any]
811+
# Return a column 'formatter' function. The function must return
812+
# something that `write` knows how to write
813+
if var.is_time:
814+
return var.repr_val
815+
elif var.is_continuous:
816+
return lambda value: "" if isnan(value) else value
817+
elif var.is_discrete:
818+
return lambda value: "" if isnan(value) else var.values[int(value)]
819+
elif var.is_string:
820+
return lambda value: value
821+
else:
822+
return var.repr_val
823+
824+
formatters = [formatter(v) for v in vars]
808825
for row in zip(data.W if data.W.ndim > 1 else data.W[:, np.newaxis],
809826
data.X,
810827
data.Y if data.Y.ndim > 1 else data.Y[:, np.newaxis],
811828
data.metas):
812-
write(['' if isinstance(val, Number) and isnan(val) else
813-
var.values[int(val)] if var.is_discrete else
814-
var.repr_val(val) if isinstance(var, TimeVariable) else
815-
val
816-
for var, val in zip(vars, flatten(row))])
829+
write([fmt(v) for fmt, v in zip(formatters, flatten(row))])
817830

818831
@classmethod
819832
def qualified_name(cls):

0 commit comments

Comments
 (0)