私信  •  关注

S3DEV

S3DEV 最近创建的主题
S3DEV 最近回复了

结合我的评论和@khelwood的评论:

TL;博士:
在分析字节码进行这两种比较时,它揭示了 'time' “时间” 字符串被指定给同一个对象。因此 身份检查 (C级)是比较速度提高的原因。

相同对象赋值的原因是 实施细节 ,CPython实习生字符串,仅包含“名称字符”(即alpha和下划线字符)。这将启用对象的身份检查。


字节码:

import dis

In [24]: dis.dis("'time'=='time'")
  1           0 LOAD_CONST               0 ('time')  # <-- same object (0)
              2 LOAD_CONST               0 ('time')  # <-- same object (0)
              4 COMPARE_OP               2 (==)
              6 RETURN_VALUE

In [25]: dis.dis("'time'=='1234'")
  1           0 LOAD_CONST               0 ('time')  # <-- different object (0)
              2 LOAD_CONST               1 ('1234')  # <-- different object (1)
              4 COMPARE_OP               2 (==)
              6 RETURN_VALUE

分配时间:

“加速”也可以在时间测试中使用赋值中看到。将两个变量赋值(和比较)到同一个字符串,比将两个变量赋值(和比较)到不同的字符串要快。进一步支持这一假设,其基本逻辑是执行对象比较。这将在下一节中得到证实。

In [26]: timeit.timeit("x='time'; y='time'; x==y", number=1000000)
Out[26]: 0.0745926329982467

In [27]: timeit.timeit("x='time'; y='1234'; x==y", number=1000000)
Out[27]: 0.10328884399496019

Python源代码:

正如@mkrieger1和@masklin在他们的评论中所提供的帮助 source code 对于 unicodeobject.c 首先执行指针比较,如果 True ,立即返回。

int
_PyUnicode_Equal(PyObject *str1, PyObject *str2)
{
    assert(PyUnicode_CheckExact(str1));
    assert(PyUnicode_CheckExact(str2));
    if (str1 == str2) {                  // <-- Here
        return 1;
    }
    if (PyUnicode_READY(str1) || PyUnicode_READY(str2)) {
        return -1;
    }
    return unicode_compare_eq(str1, str2);
}

附录:

  • Reference answer 很好地演示了如何读取反汇编字节码输出。由@Delgan提供
  • Reference answer 这很好地描述了CPython的弦乐训练。《暗影游侠》中的Coutresy
5 年前
回复了 S3DEV 创建的主题 » 基于另一个排序嵌套列表python对嵌套列表进行排序

这不是一条单行线,而是为那些 pandas 他们的目标是:

import pandas as pd

a = [["2019-10-13","2019-10-12","2019-10-14","2019-10-11"],[10,28,5,37]]

df = pd.DataFrame({'dates': a[0], 'values':a[1]}).sort_values('dates')
b = [df['dates'].tolist()] + [df['values'].tolist()]

print(b)

输出:

这将保留 [[list], [list]] 从你的问题结构。

[['2019-10-11', '2019-10-12', '2019-10-13', '2019-10-14'], [37, 28, 10, 5]]