Python 的效率編程_simplified

Python 说是当今最热门的编程语言之一,相信大家都不会反对。在去年就有报导说在美国顶针的计算机大学当中,有80%的大学已选用Python 作为编程入门的教学语言。在三维动画业界当中,也越来越多软件支援使用Python 来作开发,使制作人员能容易开发出相关工具,从而提升工作效能。跟Perl 和Ruby 一样,Python 被归类为Scripting language,设计取向为语法简单,但秏用系统资源比较多,被形容为「犠牲执行效率去换取编程的开发时间」。在这里让我们来分享一些有关怎么去做Python 编程的例子,可以让我们争取更多的执行效率。例子一・ 交换两个变数的值: import timeit def doSwapWVar(): a = 1 b = 2 tmp = a a = b b = tmp def doSwapWOVar(): a = 1 b = 2 a,b = b,a if name == 'main': t1 = timeit.Timer('doSwapWVar()', 'from main import doSwapWVar') t1.timeit() - t2 = timeit.Timer('doSwapWOVar()', 'from main import doSwapWOVar') t2.timeit() The execute time print 'Swap with create variable : ', min(t1.repeat(3, 3000000)) print 'Swap without create variable : ', min(t2.repeat(3, 3000000)) print 'Swap with create variable : ', min(t1.repeat(3, 3000000)) print 'Swap without create variable : ', min(t2.repeat(3, 3000000)) print 'Swap with create variable : ', min(t1.repeat(3, 3000000)) print 'Swap without create variable : ', min(t2.repeat(3, 3000000)) Result : Swap with create variable : 0.577996969223 Swap without create variable : 0.568822145462 Swap with create variable : 0.588035106659 Swap without create variable : 0.556537151337 Swap with create variable : 0.599809169769 Swap without create variable : 0.563858985901a,b = b,a 是Python 的一个典殿堂范例,完美展现出Python 语法的简单和优雅,但好处不只这样。我们使用timeit 来统计这两个不同的交换方法执行所需的时间,doSwapWVar是产生一个参数来暂存其中一个变数的值,另一个doSwapWOVar是直接运用Tuple的打包/解包来实现互换。我们从结果看到,doSwapWOVar 执行的效率明显比doSwapWVar 快。例子二・使用if 还是使用 try/except:我们先来看下面的程式码 import timeit def doCheckUsingIf(x): d = {1:None, 2:None, 3:None, 4:None, 5:None, 6:None, 7:None, 8:None} for i in range(1, x): if i in d: di = i def doCheckUsingTry(x): d = {1:None, 2:None, 3:None, 4:None, 5:None, 6:None, 7:None, 8:None} for i in range(1, x): try: di = i except: pass if name == 'main': t1 = timeit.Timer('doCheckUsingIf(10)', 'from main import doCheckUsingIf') t1.timeit() t2 = timeit.Timer('doCheckUsingTry(10)', 'from main import doCheckUsingTry') t2.timeit() print 'Check using if :', t1.repeat(1) print 'Check using try :', t2.repeat(1) Result : Check using if : 2.5136549472808838 Check using try : 2.1905322074890137 这次我们想要对一个dictionary 里面的key,指定一个跟key 一样的值。在Python 当中,如果指定值的Key 是不存在的话,系统就会返回错误。在doCheckUsingIf 当中,每次执行「d[i] = i」之前,都会用if 去先检查目标的key 是否存在于dictionary 里面。而doCheckUsingTry 当中,使用了try/except 去处理当「d[i] = i」错误发生的状况。从上面的结果看到的,使用Try/except 比使用if 所花的时间少。我们来修改一下刚刚的程式码 import timeit def doCheckUsingIf(x): d = {1:None, 2:None, 3:None } for i in range(1, x): if i in d: di = i def doCheckUsingTry(x): d = {1:None, 2:None, 3:None } for i in range(1, x): try: di = i except: pass if name == 'main': t1 = timeit.Timer('doCheckUsingIf(10)', 'from main import doCheckUsingIf') t1.timeit() t2 = timeit.Timer('doCheckUsingTry(10)', 'from main import doCheckUsingTry') t2.timeit() print 'Check using if :', t1.repeat(1) print 'Check using try :', t2.repeat(1) Result : Check using if : 1.8367161750793457 Check using try : 2.2109630107879639我们只修改了d 在初始化时的内容,减少了一部份的key。有趣的是,这次的结果跟刚刚完全相反,运行doCheckUsingIf 比doCheckUsingTry 快!确实是当进入except 的次数比较多的状况下,执行所花的时间会非常多,但这是否代表我们就不应使用Try/except 呢?其实我们在编写程式的时候,不应该容许返回错误那么多的情况出现,只要我们在编程时注意所处理资料的向性,使用Try/except 也绝对可以是高效的。例子三· 比对两个List import timeit def doCompareWithList(): a = range(30) b = range(10) for number in a: if number not in b: b.append(number) def doCompareWithDict(): a = range(30) b = range(10) dictB = dict.fromkeys(b) for number in a: if number not in dictB: a.append(number) dictBnumber = None b.append(number) if name == 'main': t1 = timeit.Timer('doCompareWithList()', 'from main import doCompareWithList') t1.timeit() t2 = timeit.Timer('doCompareWithDict()', 'from main import doCompareWithDict') t2.timeit() print 'Compare between with list :', t1.repeat(1) print 'Compare between with dict :', t2.repeat(1) Result: Compare between with list : 21.412750959396362 Compare between with dict : 12.298678874969482现在我们想要做的是比对一下a 跟b 两个List 里面的元素,当发现a 当中有b 没有的元素时,就把这个元素加入b 里面。在doCompareWithList 当中,用for 把a 的每一个元素代入成number,用if number not in b 去检查,我们要注意的是,这样要遍历整个b 才会知道number 是不存在的。所以当a 有大量b 没有的元素的话,遍历整个b 的次数会非常非常多。在doCompareWithDict 当中,我们在比对之前先用b 的元素创建了dictB 这个dictionary,然后用if number not in dictB 来比对,检查number 是否跟一个dictionary 的key 相同,所执行的速度是非常快,key数量的多少不会对这速度有太大的影响,所以我们看到范例的做法,doCompareWithDict 比doCompareWithList 效率超出了43%。以上就是本期瑞云学堂的内容,希望对CG感兴趣的朋友可以关注我们的微信公众平台,或者官方微博,下期瑞云小讲堂再见!

2015-02-09 08:38:52Python
小讲堂
Maya物体随机颜色教程案例二

背景: 很多情况下,在一个场景中我们很多类似的物体,有着相同的材质只是在颜色上有不同,比如一棵树上有上千的叶子,这些叶子的颜色有绿的,有黄的,有褐的。。。。。如果想把这各种颜色都能制作出来,我们就要一个一个给材质加载贴图,这样做很麻烦,效果也很低。 这个教程将告诉你怎么用一个ramp节点来控制多个物体的颜色。 原理: 使用arnold提供的aiUserDataColor节点使用每个物体的颜色受各的属性控制,再通过表达式从ramp上获取到随机的颜色赋给每一个物体。aiUserDataColor这个节点的作用就是给物体的shape节点上添加属性,通aiUserDataColor来读取这个属性的值以改变物体的颜色。 第一步:打开maya通过复制来创建很多个小球,创建一个面片pPlane1,一个aiSkyDomeLight来方便我们渲染观察。打开Hypershade窗口,并创建一个aiStandard 材质(aiStandard1)赋给所有的小球。渲染所下 第二步:选中所有的小球,打开脚本编辑器运行下面的脚本: string $sel[] = ls -sl; for($current in $sel) { string $shape[] = listRelatives -s $current; if(!attributeExists delightSurfaceColor $shape[0]) { addAttr -ln "mtoa_constant_Color" -at double3 $shape0; addAttr -ln "mtoa_constant_ColorR" -at double -p "mtoa_constant_Color" $shape0; addAttr -ln "mtoa_constant_ColorG" -at double -p "mtoa_constant_Color" $shape0; addAttr -ln "mtoa_constant_ColorB" -at double -p "mtoa_constant_Color" $shape0; setAttr -e -keyable true ($shape0 + ".mtoa_constant_Color"); setAttr -e -keyable true ($shape0 + ".mtoa_constant_ColorR"); setAttr -e -keyable true ($shape0 + ".mtoa_constant_ColorG"); setAttr -e -keyable true ($shape0 + ".mtoa_constant_ColorB"); } } 这些脚本的做用是,给所有的小球添加mtoa_constant_Color 属性。 第三步:运行下面的脚本: shadingNode -asTexture -n "ColorRamp" ramp; 创建一个叫做ColorRamp的ramp,这样创建出来的ramp是没有连接place2dTexture节点的,如果手动创建要记得打断与place2dTexture的连接。 第四步:选中所有的小球,运行下面的脚本: string $sel[] = ls -sl; for($current in $sel) { select -r $current ; pickWalk -d down; string $shape []= ls -sl; if(!attributeExists delightSurfaceColor $shape[0]) { expression -s "float $vCoord = rand(0,1);\nsetAttr \"ColorRamp.uvCoord.vCoord\" ($vCoord);\nvector $color = getAttr ColorRamp.outColor;\nmtoa_constant_ColorR = $color.r;\nmtoa_constant_ColorG = $color.g;\nmtoa_constant_ColorB = $color.b;" -o $shape0 -ae 1 -uc all ; } } 这个脚本的作用是给所有小球的 mtoa_constant_Color属性上添加一个表达式来随机读取ramp上的颜色。 第五步:运行下面的脚本,创建一个aiUserDataColor ,设置color attr Name属性为 Color; string $aidataColor = shadingNode -asTexture aiUserDataColor; setAttr -type "string" ($aidataColor+".colorAttrName") "Color"; 第六步:把aiUserDataColor 连接到aiStandard1的color属性上,赋给物体。渲染结果为: 第七步:改变ramp的颜色, 改变时间线上的当前帧(因为maya的表边式赋值是基于时间的),再次渲染为: 第八步:通过改变ramp的颜色取值,可以得到自己想要的随机颜色。 除了直接把aiUserDataColor连接到color上我们也可以把他连接到高光或者其它的颜色属性上,也可以把得到这个随机颜色通乘除节点或者加减节点和贴图连接到一起来改贴图的颜色。 以上就是本期瑞云学堂的讲授内容,讲述了如何在maya场景中控制物体的随机颜色的方法,希望感兴趣的朋友赶紧打开maya软件按照我们的例子一步一步操作一下,相信你会学到很多知识,请关注我们的微信公众号吧。下期瑞云小讲堂再见!

2015-01-12 07:50:43Maya
小讲堂
Maya物体随机颜色教程案例一

背景:很多情况下,在一个场景中我们很多类似的物体,有着相同的材质只是在颜色上有不同,比如一棵树上有上千的叶子,这些叶子的颜色有绿的,有黄的,有褐的。。。。。如果想把这各种颜色都能制作出来,我们就要一个一个给材质加载贴图,这样做很麻烦,效果也很低。这个教程将告诉你怎么用一个ramp节点来控制多个物体的颜色。原理:使用arnold提供的aiUserDataColor节点使用每个物体的颜色受各的属性控制,再通过表达式从ramp上获取到随机的颜色赋给每一个物体。aiUserDataColor这个节点的作用就是给物体的shape节点上添加属性,通aiUserDataColor来读取这个属性的值以改变物体的颜色。举例1:第一步:打开maya,在场景中创建一个面片pPlane1,一个小球pSphere1,并创建一个aiSkyDomeLight来方便我们渲染观察。打开Hypershade窗口,并创建一个aiStandard 材质(aiStandard1)赋于pSphere1。pPlane1使用默认材即可。渲染效果如下图: 第二步:在outliner里打开显示 shape节节的选项,并选中pSphere1的shaper节点: 第三步:ctrl+a 打开属性编辑器,在pSphere1的shaper节点上添加属性,属性名为:mtoa_constant_Color,属性类型为:vector 。截图如下: 第四步:在Hypershade中创建一个aiUserDataColor 并把连接这个节点到aiStandard1的color属性上 第五步:选择aiUserDataColor在属性编辑器中改变Color Attr Name为:“Color” 第六步:改变pSphereShape1的添加属性 mtoa_constant_Color 的值为 010 (渲染结果) 通过上面的几个步骤,我们就可以通过修改物体的上这个属性来改变物体渲染出来的颜色。这个就是aiUserDataColor节点的基本用法。如果一个场景中有上百个物体,就使用上一个例子的方法手动一个一个添加属性了,这时就要使用一些简单的mel脚本来加速我们的操作。以上就是本期瑞云学堂的讲授内容,讲述了如何在maya场景中控制物体的随机颜色的方法,希望感兴趣的朋友赶紧打开maya软件按照我们的例子一步一步操作一下,相信你会学到很多知识,请关注我们的微信公众号吧。下期瑞云小讲堂再见!

2015-01-06 07:46:41Maya
小讲堂
深圳市瑞云科技CIS设计分享第三期:LOGO标志设计结合

CIS颜色运用在LOGO中 品牌转型期LOGO结合口号LOGO结合公司文化不正确的使用LOGO方式: 今天小编和大家总结了一下公司CIS的大概情况的解析,希望对大家有所帮助哦!

2014-12-30 07:52:59CIS设计
小讲堂
深圳市瑞云科技CIS设计分享第二期:色彩搭配篇

底色:青色/邦迪蓝色+靛黑色间色:蓝绿色+琥珀色三次色:灰蓝色+银亮蓝色+藏蓝色■ 品牌色彩灵感:底色:源自和平,高科技,高效率间色:源自冷静,神秘,庄重三次色:来源激情,光荣,丰硕下一期预告:CIS颜色标志设计

2014-12-19 09:15:37CIS设计
小讲堂
深圳市瑞云科技CIS设计分享第一期:企业文化篇、标志篇
设计理念:大气、从容、优雅、简洁	RAYVISION图标的两道光,一代表RAY:从云端俯瞰,视线逐渐集中;一代表VISION:地表发出至天际,光茫逐渐扩张	RAY中文含义-瑞:人定胜天的光茫,从地表发出至天际,充满积极热情的能量;古代作为凭信的玉器,浑然温润,炯炯发光;引申为吉详,好预兆。	VISION中文含义-云:象征智慧与远见,是从云端俯瞰万事万物,前瞻未来,洞烛机先;为古代象征平和与繁荣的图腾(纹样),源于先人之自然(天界)崇拜,象征恒远的哲思与祝祷。	标识解析:我们的LOGO从字体到宽度,再到每个字母的弧度都是独家设计的哦!今天就先分享到这里,下次小编再带你一起欣赏解析专属瑞云的CIS设计哈!剧透一下第二期:色彩搭配篇
2014-12-15 08:15:01CIS设计
小讲堂
BFA“瑞云科技”大视频讲堂第六期“好莱坞电影产业与娱乐法”

12月10日,北京电影学院大视频讲堂将开始第6期讲座,主题为《好莱坞电影娱乐法》,演讲人为美国洛杉矶洛约拉大学法学院(Loyola Law School Los Angeles)宋海燕教授。大视频讲堂由深圳瑞云科技冠名,北京电影学院主办,北京电影学院管理系、中国电影产业发展研究院承办。讲堂将“以科技和产业的视角关注中国电影在大视频时代的变革”。我们拟邀请嘉宾来源包括但不限于:电影产业、广电行业、互联网产业、通讯运营商等。讲座时间:2014年12月10日18:30—21:00讲座地点:北京电影学院C楼236具体流程18:00听众入场18:30讲座开始20:30听众交流宋海燕博士简历:宋海燕博士,现为美国洛杉矶洛约拉大学法学院教授(Loyola Law School Los Angeles),北京大学国际法学院访问教授,中国人民大学知识产权学院客座教授,意大利博洛尼亚大学访问教授,《美国版权法律期刊》(The Journal of Copyright Society of the US.)编委会成员,美国亚洲协会南加州分会董事及执委会成员。曾任美国迪士尼公司亚太区高级知识产权法律顾问,金杜律师事务所合伙人,美国阿诺-波特律师事务所顾问,于中国大陆、香港及美国执业近二十年。代表作包括:专著《娱乐法》(商务印书馆2014年)、《中国版权新问题—网络侵权责任、Google图书馆案、比赛转播权》(商务印书馆2011年)、英文著作“New Challenges of Chinese Copyright Law in the Digital Age”(Wolters Kluwer 2011年)、英文译著“Selected Chinese Patent Cases”(Wolters Kluwer 2014年)等。多次在中国最高人民法院、美国专利商标局、美国商会、美国律师协会、美国电影协会、香港律师协会及中外知名法学院就知识产权问题发表演讲。美国加州伯克利大学(University of California, Berkeley School of Law)法学博士(J.S.D),加州伯克利大学法学硕士(LL.M),香港大学法学硕士(LL.M)。美国加州执业律师,中国执业律师。2006至2010年蝉联《亚洲法律与实践》“亚太地区最佳知识产权律师”。2007年选为美国亚洲协会“二十一世纪杰出青年领袖”。

2014-12-10 08:18:47好莱坞
小讲堂
Turtle渲染器之最终聚集

在Final Gather中应用HDRI HDRI,既高动态范围图象。所谓动态范围是图像上从最暗到最亮的跨度。通俗的理解:一般计算机中图象的RGB以0-255阶来记录。但现实中的图象颜色往往要高于这一范围,那些超出的范围就叫高动态范围。而并非有些资料所解释的HDR图象含有亮度通道。一般记录高动态范围图象的文件格式有.HDR.PIC.TIFF....但并非这些格式的都是高动态范围图象。大家可以到一些相关网站下载HDR图象。首先我们在全局渲染面板里关闭MAYA的默认光源。 然后我们要找到并开启Final Gather(最终聚集) 。 接下来,我们要为场景模拟一个环境。创建一个多边形球体,删除下半球,然后使上半球体笼罩整个场景。 接着我们要为环境赋予一个材质。创建一个LAMBERT,给它的COLOR项连接一个HDR贴图。并把它赋予那个半球体。先渲染看一下。渲染完成,但是我们发现没有任何的图象.因为我们并没有给该场景设置任何光源。Final Gather也是通过亮度信息来计算间接光的。除了给场景设置光源,我们还可以调整材质的incandescence(白热)和ambient color(环境色)属性来控制物体的亮度信息。现在我们来对创建好的LAMBERT材质的incandescence(白热)和ambient color(环境色)两个属性进行设置。把incandescence(白热)设置为:0.2ambient color(环境色)设置为0.25.现在我们渲染看看。 颜色和光效感觉还不错,但是画面质量上出现了明显的杂斑,那是因为HDR图象具有丰富的色彩过度和颜色范围,也正是因为这种特性,使的用过HDR图象的作品有时可以产生现实级的效果。我们可以增加Gathering Rays的数值来提高画面的精度,但是过高的Gathering Rays也会延长渲染的时间。或者我们可以提高smooth(平滑半径)的数值,但是这样也会损失一些光线阴影的精度,使物体失去重量感.所以我们要合理的搭配这两个属性的值。经过反复测试,最终我们调整Gathering Rays值为:2000 。smooth值为:1.5,其他属性使用缺省即可。渲染效果如下。好啦,这一期的【瑞云小讲堂】就介绍到这吧,希望对CG的爱好者们有所帮助,我们下期再分享咯!

2014-12-09 08:19:51Turtle渲染器
小讲堂

热搜关键词

搜索

媒体支持

media-0media-1media-2media-3media-4media-5media-6media-7media-8media-9media-10media-11media-12media-13media-14media-15media-16media-17media-18media-19media-20