V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hjq98765
V2EX  ›  Python

关于 string→list 的效率对比疑问

  •  
  •   hjq98765 · 2016-05-27 00:57:20 +08:00 · 3610 次点击
    这是一个创建于 3103 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有一个 a=“ a,b,c,d,e,f,g ”的以逗号作为分隔符的字符串 a ,想变为 list ,我现在想到了两种办法:
    1 、 list_a=a.split(',')
    2 、 list_a=eval('['+a+']')
    为什么第二种方法的速度会比第一种方法慢很多呢?
    第 1 条附言  ·  2016-05-27 15:28:42 +08:00
    其实原字符串是一串数值,是从一个.csv 文件中读取的,想在不 import csv 的情况下加快读取速度

    对于读取到的 a='1,2,3,4,5',想将它变成 list_a=[1,2,3,4,5],就有上面说的两种办法
    其实第一种方法应该是 list_a=[int(i) for i in a.split(',')],加了一个 list 重构操作,但是这样依然要比第二种办法快很多,结果可以保证是正确的

    似乎 @msg7086 的答案就是正解?
    11 条回复    2016-05-28 08:48:43 +08:00
    msg7086
        1
    msg7086  
       2016-05-27 01:41:57 +08:00   ❤️ 1
    第一种需要查找字符串
    第二种需要准备一个 Python 编译器环境,准备一个执行虚拟机,然后执行这段代码,获取返回值,再销毁之前创建的各种东西。
    binux
        2
    binux  
       2016-05-27 01:50:48 +08:00
    因为,在代码能成功执行之前,它就需要被切成 list 才能被解释器理解。
    SoloCompany
        3
    SoloCompany  
       2016-05-27 02:16:31 +08:00
    先不说有多奇葩
    你真的有验证过第二种方法的执行正确性?
    tonyluj
        4
    tonyluj  
       2016-05-27 02:19:06 +08:00
    a="'a', 'b', 'c'"
    list_a = eval('[' + a + ']')
    monkeylyf
        5
    monkeylyf  
       2016-05-27 02:55:09 +08:00
    你的第二种方法需要给 a, b.. 套上引号. eval 是有安全隐患的, 而且慢. 如果你一定要用的话试试 ast.literal_eval
    ayaseangle
        6
    ayaseangle  
       2016-05-27 08:29:15 +08:00 via Android
    第二种方法好牛逼。。。
    araraloren
        7
    araraloren  
       2016-05-27 08:39:54 +08:00
    EVAL 这种东西就是很厉害但是不安全。。
    leavic
        8
    leavic  
       2016-05-27 12:01:03 +08:00
    打死我都想不出第二种写法,太奇葩了。。。。
    hjq98765
        9
    hjq98765  
    OP
       2016-05-27 15:30:05 +08:00
    @SoloCompany
    @tonyluj
    第二种方法对于字母是不可以的,换成数字是可以的,我在主楼有补充
    Allianzcortex
        10
    Allianzcortex  
       2016-05-27 15:41:23 +08:00
    EVAL ……楼主你这真是开脑洞,方法 1 是官方推荐的方法,次优的方法应该是用工厂函数:

    list_a=list(a.replace(',',''))
    franklinyu
        11
    franklinyu  
       2016-05-28 08:48:43 +08:00
    審查代碼,看到 eval 先說一句 fuck 。另外一樓是正解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2905 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:39 · PVG 20:39 · LAX 04:39 · JFK 07:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.