社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  S3DEV  »  全部回复
回复总数  2

结合我的评论和@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]]