PERF: fastpath on Period construction from PeriodIndex · Issue #5155 · pandas-dev/pandas (original) (raw)

@jreback

vbench already in timeseries/period_setitem
very inefficient because on the boxing of the PeriodIndex (to an object index), it recomputes the freq for each Period (even though it is passed), need a fastpath on this type of construction

In [1]: rng = period_range('1/1/1990', freq='S', periods=20000)

In [2]: df = DataFrame(index=range(len(rng)))

In [3]: def f():
   ...:     df['col'] = rng
   ...:     
   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    40000    0.055    0.000    0.095    0.000 abc.py:128(__instancecheck__)
    20000    0.043    0.000    0.345    0.000 period.py:66(__init__)
    20000    0.037    0.000    0.381    0.000 period.py:683(<lambda>)
    80031    0.037    0.000    0.131    0.000 {isinstance}
    20000    0.034    0.000    0.223    0.000 frequencies.py:76(get_freq_code)
    60003    0.029    0.000    0.029    0.000 _weakrefset.py:68(__contains__)
    20000    0.028    0.000    0.063    0.000 frequencies.py:464(_base_and_stride)
    20000    0.028    0.000    0.028    0.000 {method 'match' of '_sre.SRE_Pattern' objects}
    20000    0.027    0.000    0.038    0.000 frequencies.py:767(_period_str_to_code)
    40000    0.023    0.000    0.144    0.000 common.py:1730(is_integer)
        1    0.016    0.016    0.398    0.398 {pandas.lib.map_infer}
    40007    0.010    0.000    0.010    0.000 {getattr}
    20000    0.009    0.000    0.012    0.000 frequencies.py:112(_get_freq_str)
    60000    0.008    0.000    0.008    0.000 {method 'get' of 'dict' objects}
    40000    0.006    0.000    0.006    0.000 {method 'group' of '_sre.SRE_Match' objects}
    20000    0.004    0.000    0.004    0.000 {method 'lower' of 'str' objects}
    20000    0.002    0.000    0.002    0.000 {method 'upper' of 'str' objects}
    20015    0.002    0.000    0.002    0.000 {len}