Skip to content

Commit d78f4f6

Browse files
committed
PERF: more speedups
1 parent 7ac83eb commit d78f4f6

File tree

2 files changed

+16
-22
lines changed

2 files changed

+16
-22
lines changed

pandas/core/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,7 @@ def _helper_csv(self, writer, na_rep=None, cols=None,
13141314
if float_format:
13151315
values[imask] = np.array([ float_format % val for val in v[imask] ])
13161316

1317-
series[k] = values
1317+
series[k] = values.tolist()
13181318

13191319
has_aliases = isinstance(header, (tuple, list, np.ndarray))
13201320
if has_aliases or header:

pandas/lib.pyx

+15-21
Original file line numberDiff line numberDiff line change
@@ -789,47 +789,41 @@ def array_replace_from_nan_rep(ndarray[object, ndim=1] arr, object nan_rep, obje
789789

790790
def write_csv_rows(dict series, list data_index, int nlevels, list cols, object writer):
791791

792-
cdef int N, j, i
793-
cdef list rows, all_cols
792+
cdef int N, j, i, ncols
793+
cdef list rows
794794
cdef object val
795795

796796
# In crude testing, N>100 yields little marginal improvement
797797
N=100
798798

799799
# pre-allocate rows
800-
rows = [[None]*(nlevels+len(cols)) for x in range(N)]
801-
802-
all_cols = []
803-
if len(cols) < 10000: # 10000 as in "usually"
804-
all_cols = list(enumerate(cols))
800+
ncols = len(cols)
801+
rows = [[None]*(nlevels+ncols) for x in range(N)]
805802

806803
j = -1
807804
if nlevels == 1:
808-
for j, idx in enumerate(data_index):
805+
for j in range(len(data_index)):
809806
row = rows[j % N]
810-
row[0] = idx
811-
for i, col in (all_cols or enumerate(cols)):
812-
val = series[col][j]
813-
row[nlevels+i] = np.asscalar(val) if isinstance(val,np.number) else val
807+
row[0] = data_index[j]
808+
for i in range(ncols):
809+
row[nlevels+i] = series[cols[i]][j]
814810

815811
if j >= N-1 and j % N == N-1:
816812
writer.writerows(rows)
817813
elif nlevels > 1:
818-
for j, idx in enumerate(data_index):
814+
for j in range(len(data_index)):
819815
row = rows[j % N]
820-
row[:nlevels] = list(idx)
821-
for i, col in (all_cols or enumerate(cols)):
822-
val = series[col][j]
823-
row[nlevels+i] = np.asscalar(val) if isinstance(val,np.number) else val
816+
row[:nlevels] = list(data_index[j])
817+
for i in range(ncols):
818+
row[nlevels+i] = series[cols[i]][j]
824819

825820
if j >= N-1 and j % N == N-1:
826821
writer.writerows(rows)
827822
else:
828-
for j, idx in enumerate(data_index):
823+
for j in range(len(data_index)):
829824
row = rows[j % N]
830-
for i, col in (all_cols or enumerate(cols)):
831-
val = series[col][j]
832-
row[nlevels+i] = np.asscalar(val) if isinstance(val,np.number) else val
825+
for i in range(ncols):
826+
row[nlevels+i] = series[cols[i]][j]
833827

834828
if j >= N-1 and j % N == N-1:
835829
writer.writerows(rows)

0 commit comments

Comments
 (0)