各位猿类们如何看待语法糖?

2013-11-18 10:10:55 +08:00
 jtn007
语法糖很多时候的确能让代码看起来,写起来更加舒服,但是有时却会降低一些程序的运行效率。这个社区里大多都不是C,C++这种底层的更多追求运行速度的猿们吧?不知道大家怎么看?
16608 次点击
所在节点    程序员
40 条回复
luikore
2013-11-18 16:59:32 +08:00
语法糖和易读性不是正相关也不是负相关, 和性能也是没什么关系.
要求"不能用语法糖"就像要求写字要让文盲能看懂差不多.
jtn007
2013-11-18 17:01:01 +08:00
@nil
@luikore 恩,受教了,谢谢
josephshen
2013-11-18 17:04:55 +08:00
我喜欢吃糖,虽然有着蛀牙的风险
csslayer
2013-11-18 17:05:33 +08:00
语法糖不应该和性能有关系,如果因为不同语法实现相同功能而导致了运行时的不同,那就不能算作语法糖了。
Golevka
2013-11-18 21:13:31 +08:00
许多编程语言的设计/实现都从一个功能高度正交的core language开始, core language拥有整个语言的[全部]表达能力, 但是直接用core language写代码实在是太卧槽了于是我们还需要做一些语法糖出来让撸代码更快乐些. 所以许多语言的编译过程都有一个叫做desugar的阶段, 目的就是把带糖衣的语法变换成更容易处理的core language.

综上所述, 语法糖是好东西. 它在不增加语言本质复杂度的同时提升了语言的可用性.
hahastudio
2013-11-18 22:07:51 +08:00
@Keyes 话说
s_list = [i for i in xrange(100) if i % 2 == 0]
不是更好懂一些= =
zongpo
2013-11-19 08:39:51 +08:00
喜欢甜甜的语法糖
liushuaikobe
2013-11-19 09:17:05 +08:00
@hahastudio
+1
这样写不能同意更多,100没必要用xrange
@Keyes 花一下午时间把lambda和filter搞懂不是更好吗?
mengzhuo
2013-11-19 09:21:24 +08:00
> 比如,我团队里的同事PYTHON水平都差不多,达到了了解PYTHON大部分特性的程度,我要实现一个
> 取100以内可以被2整除的自然数列表:
>
> >>> s_list = filter(lambda x:not x%2, xrange(0, 100))
> >>> print s_list
> 一行就搞定了

其实再快都不如列式推导,匿名函数+filter,再cache都不行。
ifilter也是不错的选择
-----------------------------------
In [6]: %%timeit
s_list = filter(lambda x:not x%2, xrange(0, 100))
...:
10000 loops, best of 3: 38.4 µs per loop

In [7]: %%timeit
...: s_list = [x for x in xrange(0, 100) if not x%2]
...:
10000 loops, best of 3: 22.6 µs per loop

In [8]: from itertools import ifilter

In [9]: %%timeit
s_list = ifilter(lambda x:not x%2, xrange(0, 100))
...:
1000000 loops, best of 3: 1.36 µs per loop

至于ls的运算符重载,显然已经踏入黑魔法的范畴了……
zava
2013-11-19 09:22:12 +08:00
从某种程度上讲,C、C++不都是汇编的语法糖吗?汇编不都是二进制的语法糖吗?
fwee
2013-11-19 10:30:15 +08:00
除非直接写机器码,要不都是语法糖
unionx
2013-11-19 11:10:56 +08:00
计算机科学里并没有“语法糖”这个定义
proudduck
2013-11-19 12:00:20 +08:00
@2thetop 哈哈哈哈哈,杀马特滚粗
Foredoomed
2013-11-19 12:22:26 +08:00
看你的审美了,比如Ruby里的Object.new和python里的new Object()
raymanyoung
2013-11-19 13:35:18 +08:00
一般来说需要编译的语言都会在编译的时候把语法糖转换一次,就是说执行上来讲并没有任何区别。至于解释性语言就要具体问题具体分析了。不过个人意见是大部分时候还是以代码的可读性为优先度,可读性和模块化好的话,针对瓶颈代码单独优化都可以。
tywtyw2002
2013-11-19 14:39:15 +08:00
@mengzhuo 像你所写的类似的python编程技巧,哪些书里面有介绍这些的呢?
我写python写了一段时间,但是感觉这类的高级用法都没接触过。
mengzhuo
2013-11-19 14:59:52 +08:00
@tywtyw2002 这根本不算技巧……O‘Relly家的Python cookbook,我觉得任何一本教程都有吧……
tywtyw2002
2013-11-19 15:01:29 +08:00
@mengzhuo ok,我在仔细读读,我记得以前读得时候基本没有看到 filter,lambda语法唐之类的东西
Keyes
2013-11-19 17:18:20 +08:00
@mengzhuo
@liushuaikobe
@hahastudio

这例子不是说代码的“数学”。。。是说写代码的“语文”。。。
suspended
2013-11-19 22:44:11 +08:00
@Keyes

python 真是难懂,看看我大ruby:

C:\>irb
irb(main):001:0> (0..100).select {|i| i%2 == 0}
=> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 4
0, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 8
0, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

irb(main):002:0> 0.step(100,2).to_a
=> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 4
0, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 8
0, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
irb(main):003:0>

两种都是一行,而且不懂ruby的猿也能秒懂。
ps: 我读书的时候0 还不是自然数...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/89648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX