page templates and "python:"
Hi, what does exactly happen when I use "python:" into a zpt? Is it a problem if I have many "python:" in my page templates? What are the differences in performances of these two definitions? <metal:block tal:define="my_value my_object/getValue">...</metal:block> <metal:block tal:define="my_value python:my_object.getValue()">...</metal:block> thank you very much claudio :-)
--On 3. Juli 2006 15:05:36 +0200 Claudio Battaglino <c.battaglino@metaware.it> wrote:
Hi, what does exactly happen when I use "python:" into a zpt? Is it a problem if I have many "python:" in my page templates? What are the differences in performances of these two definitions?
Talking of performance...you might write a benchmark to figure it out... no idea
<metal:block tal:define="my_value my_object/getValue">...</metal:block>
<metal:block tal:define="my_value python:my_object.getValue()">...</metal:block>
The main difference between both variants is that in path expressions getValue can be either an attribute or a method...so at least path expressions may have some overhead...you have to measure it. -aj
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 3 Jul 2006, at 15:09, Andreas Jung wrote:
<metal:block tal:define="my_value my_object/getValue">...</ metal:block>
<metal:block tal:define="my_value python:my_object.getValue()">...</metal:block>
The main difference between both variants is that in path expressions getValue can be either an attribute or a method...so at least path expressions may have some overhead...you have to measure it.
As far as I know path expressions have better performance. I don't have the in-depth expression engine knowledge to explain why, but that's been what everyone has said to me before. jens -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin) iD8DBQFEqRmaRAx5nvEhZLIRAhsIAJsHRlq94iq7c0wbeGN92JhlikUFwgCfaClc b16sWokKTRVrWo4BtvRGVhg= =tt4I -----END PGP SIGNATURE-----
Jens Vagelpohl ha scritto:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On 3 Jul 2006, at 15:09, Andreas Jung wrote:
<metal:block tal:define="my_value my_object/getValue">...</ metal:block>
<metal:block tal:define="my_value python:my_object.getValue()">...</metal:block>
The main difference between both variants is that in path expressions getValue can be either an attribute or a method...so at least path expressions may have some overhead...you have to measure it.
As far as I know path expressions have better performance. I don't have the in-depth expression engine knowledge to explain why, but that's been what everyone has said to me before.
jens
Could it be that, using a Python expression, I have an overhead because Zope loads a Python interpreter each time it finds a "python:"? If this is true then it is better to use path expression, if possible. claudio :-)
--On 3. Juli 2006 15:38:58 +0200 Claudio Battaglino <c.battaglino@metaware.it> wrote:
Jens Vagelpohl ha scritto:
Could it be that, using a Python expression, I have an overhead because Zope loads a Python interpreter each time it finds a "python:"? If this is true then it is better to use path expression, if possible.
nah....Python expression are executed in a sandbox (RestrictedPython) which will introduce additional overhead..but let numbers speak...write a loop in TAL and compare the performance of path expressions vs. python expressions... don't guess, but measure... -aj
Andreas Jung ha scritto:
--On 3. Juli 2006 15:38:58 +0200 Claudio Battaglino <c.battaglino@metaware.it> wrote:
Jens Vagelpohl ha scritto:
Could it be that, using a Python expression, I have an overhead because Zope loads a Python interpreter each time it finds a "python:"? If this is true then it is better to use path expression, if possible.
nah....Python expression are executed in a sandbox (RestrictedPython) which will introduce additional overhead..but let numbers speak...write a loop in TAL and compare the performance of path expressions vs. python expressions... don't guess, but measure...
-aj
It seems that the Python Expression works a bit better: To the test this, I used these two Page Templates and PTProfiler: PATH EXPRESSION <div tal:define="test_user here/portal_membership/getAuthenticatedMember" tal:repeat="counter python:range(5000)"> <span tal:content="test_user/getId" /> </div> PYTHON EXPRESSION <div tal:define="test_user here/portal_membership/getAuthenticatedMember" tal:repeat="counter python:range(5000)"> <span tal:content="python: test_user.getId()" /> </div> PATH EXPRESSION Expression - Total time - Number of calls - Time per call path: test_user/getId 0.72 5000 0.00014 path: test_user/getId 0.63 5000 0.00013 path: test_user/getId 0.72 5000 0.00014 path: test_user/getId 4.0 50000 8e-05 path: test_user/getId 4.09 50000 8e-05 path: test_user/getId 4.12 50000 8e-05 PYTHON EXPRESSION Expression - Total time - Number of calls - Time per call python: test_user.getId() 0.6 5000 0.00012 python: test_user.getId() 0.51 5000 0.0001 python: test_user.getId() 0.48 5000 0.0001 python: test_user.getId() 3.19 50000 6e-05 python: test_user.getId() 3.42 50000 7e-05 python: test_user.getId() 2.96 50000 6e-05 Is it a significant test? claudio :-)
On 7/3/06, Claudio Battaglino <c.battaglino@metaware.it> wrote:
Is it a significant test?
Yes, for the use case of in-memory objects and methods. You might want to do the same with a traversal path nocall:context/folder1/folder2/folder3, or something, and then python:context.folder1.folder2.folder3 -- Lennart Regebro, Nuxeo http://www.nuxeo.com/ CPS Content Management http://www.cps-project.org/
Actually, I think python: expressions perform slightly better than their path: counterparts because their evaluation step needs to do less work (no guessing about getitem vs. getattr). Geoff Davis taught me that. But in the end it's all dwarfed by the penalty imposed by security, so it really doesn't much matter. On Jul 3, 2006, at 9:20 AM, Jens Vagelpohl wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On 3 Jul 2006, at 15:09, Andreas Jung wrote:
<metal:block tal:define="my_value my_object/getValue">...</ metal:block>
<metal:block tal:define="my_value python:my_object.getValue()">...</metal:block>
The main difference between both variants is that in path expressions getValue can be either an attribute or a method...so at least path expressions may have some overhead...you have to measure it.
As far as I know path expressions have better performance. I don't have the in-depth expression engine knowledge to explain why, but that's been what everyone has said to me before.
jens
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin)
iD8DBQFEqRmaRAx5nvEhZLIRAhsIAJsHRlq94iq7c0wbeGN92JhlikUFwgCfaClc b16sWokKTRVrWo4BtvRGVhg= =tt4I -----END PGP SIGNATURE----- _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists -http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
On 7/3/06, Chris McDonough <chrism@plope.com> wrote:
Actually, I think python: expressions perform slightly better than their path: counterparts because their evaluation step needs to do less work (no guessing about getitem vs. getattr). Geoff Davis taught me that. But in the end it's all dwarfed by the penalty imposed by security, so it really doesn't much matter.
Right. So the best and quickest is to prepare all the data in pure disk-based python. It's easy to do if you use the view methodology you get with Five, but there are other ways to do it if you don't want to use views.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Lennart Regebro wrote:
On 7/3/06, Chris McDonough <chrism@plope.com> wrote:
Actually, I think python: expressions perform slightly better than their path: counterparts because their evaluation step needs to do less work (no guessing about getitem vs. getattr). Geoff Davis taught me that. But in the end it's all dwarfed by the penalty imposed by security, so it really doesn't much matter.
Right. So the best and quickest is to prepare all the data in pure disk-based python. It's easy to do if you use the view methodology you get with Five, but there are other ways to do it if you don't want to use views.
My 'pushpage' package is an attempt to make this the "standard" pattern (pushpage templates don't have *any* top-level names available to them (i.e., 'context', 'container', 'request', etc.) except those passed to their '__call__' as keyword arguments (which traditional ZPT exposes under 'options'): http://agendaless.com/Members/tseaver/software/pushpage The templates can be used from within methods of view classes, and can also be published as "pages" via ZCML with the help of a user-defined callable which computes the keyword arguments. E.g.: <pushpage:view for=".interfaces.ISomeContentInterface" name="somepage.html" permission="zope.Public" template="templates/sometemplate.pt" mapping=".somemodule,somefunction" layer="mylayer" /> In this example, 'somemodule.somefunction' returns the mapping which 'sometemplate' will use as its top-level namespace. The callable is passed 'context' and 'request' as arguments. Tres. - -- =================================================================== Tres Seaver +1 202-558-7113 tseaver@palladion.com Palladion Software "Excellence by Design" http://palladion.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.2 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFEqTxk+gerLs4ltQ4RArSWAJ90L7NT76aPuaIk9a7cQj222qYM6QCfRPrZ gN4Q7fIm63hA4HUoViIwdBk= =2aTX -----END PGP SIGNATURE-----
Claudio Battaglino schrieb:
Hi, what does exactly happen when I use "python:" into a zpt? Is it a problem if I have many "python:" in my page templates?
Path expressions are by far better human readable IMHO. I try very hard to avoid Python expressions if possible. To give you an example: I prefer <option tal:attributes="selected item/selected" ... over <option tal:attributes="python: test(foo == bar, 'selected', None)" ... . But also because in the first example the template doesn't need to know about implementation details and thus it is better reusable e.g. as macro. Tonico
--On 3. Juli 2006 15:50:41 +0200 Tonico Strasser <contact_tonico@yahoo.de> wrote:
Claudio Battaglino schrieb:
Hi, what does exactly happen when I use "python:" into a zpt? Is it a problem if I have many "python:" in my page templates?
Path expressions are by far better human readable IMHO. I try very hard to avoid Python expressions if possible.
(Un)fortunately we live a in world where methods may have parameters. Path expressions work only for parameter-less methods. -aj
Andreas Jung schrieb:
--On 3. Juli 2006 15:50:41 +0200 Tonico Strasser <contact_tonico@yahoo.de> wrote:
Claudio Battaglino schrieb:
Hi, what does exactly happen when I use "python:" into a zpt? Is it a problem if I have many "python:" in my page templates?
Path expressions are by far better human readable IMHO. I try very hard to avoid Python expressions if possible.
(Un)fortunately we live a in world where methods may have parameters. Path expressions work only for parameter-less methods.
This can be avoided if you "prepare" a namespace and pass it to the template, this way the template doesn't need to call methods. I've written a simple page class for doing this, but it's also possible TTW from a Python script: names = {'foo': 'bar'} template = context.a_page_template return template.pt_render(extra_context=names) Of course you can still use Python expressions if needed. Tonico
participants (7)
-
Andreas Jung -
Chris McDonough -
Claudio Battaglino -
Jens Vagelpohl -
Lennart Regebro -
Tonico Strasser -
Tres Seaver