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: d[i] = 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: d[i] = 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: d[i] = i def doCheckUsingTry(x): d = {1:None, 2:None, 3:None } for i in range(1, x): try: d[i] = 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) dictB[number] = 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
小讲堂
明日西基计划(CG for tomorrow)又一力作《Life Of Bri' n Chris》 —下一个就会是你
2013年开始,深圳市瑞云科技发起:明日西基计划(CG for tomorrow)。预计投资500万的渲染设施,3年赞助100个项目。扶持在影视电脑视觉行业方面的技术发展或有理想却缺少技术、资金支持的年轻团队!动画短片《Life Of Bri' n Chris》就是其中一个项目,此动画短片由英国Anthem公司出品,MichaelWakelam自编自导。讲述的是来自苏格兰的平凡蜥蜴Bri'和来自澳大利亚的倒霉变色龙Chris之间幽默的故事,短片时长8分钟。短片集结了多位艺术家和赞助商的通力合作,经过三年的精心制作终于2015年与观众见面。《Life Of Bri' n Chris》预告视频:?vid=j0145nk0orv&amp在接下来的几个月中,我们将独家披露电影制作幕后的故事,敬请留意!
2015-01-23 03:37:53三维渲染
动态
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 $shape[0]; addAttr -ln "mtoa_constant_ColorR" -at double -p "mtoa_constant_Color" $shape[0]; addAttr -ln "mtoa_constant_ColorG" -at double -p "mtoa_constant_Color" $shape[0]; addAttr -ln "mtoa_constant_ColorB" -at double -p "mtoa_constant_Color" $shape[0]; setAttr -e -keyable true ($shape[0] + ".mtoa_constant_Color"); setAttr -e -keyable true ($shape[0] + ".mtoa_constant_ColorR"); setAttr -e -keyable true ($shape[0] + ".mtoa_constant_ColorG"); setAttr -e -keyable true ($shape[0] + ".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 $shape[0] -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设计
小讲堂
瑞云Rayvision渲染的原创动画《吃饭睡觉打豆豆》震撼来袭 ——创造产业历史,日点击量过200万次
瑞云Rayvision结缘京基昂驰《吃饭睡觉打豆豆》是深圳京基昂驰动画设计有限公司的原创3D动画作品。对于该片的渲染,京基昂驰经过招投标、镜头测试等环节后,最终选择了瑞云Rayvision渲染平台,瑞云Rayvision不负客户期望,以稳定的渲染平台、专业的技术服务、规模的计算能力,按时完成渲染,同时也奠定了双方长期合作的基础。首先,由于《吃饭睡觉打豆豆》的渲染素材量大,瑞云Rayvision采用了分批硬盘拷贝数据的方式,渲染过程中,平台智能加载渲染所需要的插件,并根据进度调用大量渲染节点,高峰时期达到500台,同时成立渲染项目组,指定TD和客服专人对接,确保渲染顺利。最终2014年11月18日,一部名为《吃饭睡觉打豆豆》的国产原创3D动画于各大视频网站轰然上线,在短短的一天时间内,片子播放次数便突破了200万次。国产动画新篇章,开创产业新时代2014年初,在看过《吃饭睡觉打豆豆》的样片后,京基集团决定强势入主昂驰动画,不仅注入巨资进行产品研发,更派出职业经理人团队参与管理运营,未来更将斥资上亿元支持京基昂驰制作具有国际水准的动画影片进军好莱坞,创造中国动画历史。有了雄厚的资金支持和良好的管理运营,《吃饭睡觉打豆豆》项目进展神速。短片未上线便获得了韩国最大的娱乐媒体公司CJE&M的青睐,并有强烈的意向购买短片于韩国地区高清设备的播放权。而京基昂驰更是精益求精,除了更为精良的3D制作外,动画更邀请到艾美奖得主,并多次为迪斯尼动画作品进行配乐的DisherMusic进行动画的全程配音。据悉,除了第一季的《吃饭睡觉打豆豆》,京基昂驰还将持续推出其他豆豆系列动画,预计整个系列将由三部不同主题却又各具特色的系列动画短片组成。为了让中国动画走出国门,京基昂驰更是邀请到了前皮克斯动画团队成员强势加盟,现正与美国动画团队在紧锣密鼓地进行着3D动画大电影《豆仙》的制作,该片预计于2016年全球影院同步上线。京基昂驰,不仅掀开了国产动画的新篇章,更是在开创着中国动画产业的新时代。短片卖座,观众叫好,市场反应强烈网友一直追问片子的更新时间,并不断转发给朋友希望更多人知道并喜欢上豆豆动画。市场的反响直接映射了京基昂驰的用心制作,期待《吃饭睡觉打豆豆》更上一层台阶!
2014-12-29 07:55:52吃饭睡觉打豆豆
案例
深圳市瑞云科技CIS设计分享第二期:色彩搭配篇
底色:青色/邦迪蓝色+靛黑色间色:蓝绿色+琥珀色三次色:灰蓝色+银亮蓝色+藏蓝色■ 品牌色彩灵感:底色:源自和平,高科技,高效率间色:源自冷静,神秘,庄重三次色:来源激情,光荣,丰硕下一期预告:CIS颜色标志设计
2014-12-19 09:15:37CIS设计
小讲堂
深圳市瑞云科技CIS设计分享第一期:企业文化篇、标志篇
设计理念:大气、从容、优雅、简洁 RAYVISION图标的两道光,一代表RAY:从云端俯瞰,视线逐渐集中;一代表VISION:地表发出至天际,光茫逐渐扩张 RAY中文含义-瑞:人定胜天的光茫,从地表发出至天际,充满积极热情的能量;古代作为凭信的玉器,浑然温润,炯炯发光;引申为吉详,好预兆。 VISION中文含义-云:象征智慧与远见,是从云端俯瞰万事万物,前瞻未来,洞烛机先;为古代象征平和与繁荣的图腾(纹样),源于先人之自然(天界)崇拜,象征恒远的哲思与祝祷。 标识解析:我们的LOGO从字体到宽度,再到每个字母的弧度都是独家设计的哦!今天就先分享到这里,下次小编再带你一起欣赏解析专属瑞云的CIS设计哈!剧透一下第二期:色彩搭配篇
2014-12-15 08:15:01CIS设计
小讲堂

热搜关键词

搜索

媒体支持

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