From: Eugene M. M. <em...@ge...> - 2005-07-20 10:07:56
|
I do some small time-test with your pux programm: *************** time test begin ******************** from pyx import * import timeit s=3D''' c =3D canvas.canvas() c.text(0, 0, "Hello, world!") c.stroke(path.line(0, 0, 2, 0)) ''' t =3D timeit.Timer(s,"from pyx import canvas, path") print "%5.2f --- initialization" % t.timeit(number=3D100) c =3D canvas.canvas() c.stroke(path.line(0, 0, 2, 0)) t =3D timeit.Timer('c.writeEPSfile("hello")',"from __main__ import c") print "%5.2f --- writing EPS file without text" % t.timeit(number=3D100) t =3D timeit.Timer('c.writePDFfile("hello")',"from __main__ import c") print "%5.2f --- writing PDF file without text" % t.timeit(number=3D100) c =3D canvas.canvas() c.text(0, 0, "Hello, world!") c.stroke(path.line(0, 0, 2, 0)) t =3D timeit.Timer('c.writeEPSfile("hello")',"from __main__ import c") print "%5.2f --- writing EPS file with text" % t.timeit(number=3D100) t =3D timeit.Timer('c.writePDFfile("hello")',"from __main__ import c") print "%5.2f --- writing PDF file with text" % t.timeit(number=3D100) *************** time test output ******************* 0.98 --- initialization 0.16 --- writing EPS file without text 0.29 --- writing PDF file without text 26.95 --- writing EPS file with text 8.20 --- writing PDF file with text *************** time test edn ********************** We see: your method of text-inclusion very good, because you produse good platform-independend PostScript. But this method very slow. Some time I don't need platform-independend PostScript, But I need very fast method of file generation. For example: in dinamic web-script I produce automatically generated picture, and piping it through ghostscript to produce png. This problem I solute by following method: I use only standart fonts (Times-Roman, Courier, Helvetica), I don't include this font into PostScript. If I need to use some 8-bit encodings (koi8-r for example), I generate on-the-fly from python Encoding-Vector for postscript. After that text may be typing as is in row native 8-bit encoding I attach sample of my code at the end of this letter. As you can see, my method can working without TeX. Of cource I can't type hardly mathematical formuls, but simple text under diagram axis can. Perhaps you can produce in your canvas-object two method: c.text(0, 0, "Hello, world!") # this working throu TeX and c.fasttext(0, 0, "Hello, world!") # and this working like I Below this I attach sample of my code: PROLOG =3D """\ /set256rgb % stack: red green blue { 256 div 3 1 roll 256 div 3 1 roll 256 div 3 1 roll setrgbcolor } bind def /DeclareFont % stack: key, encoding, font-name { 1 dict begin findfont dup maxlength dict /NFD exch def { exch dup /FID ne {exch NFD 3 1 roll put} {pop pop} ifelse } forall /Encoding findresource dup length 256 eq { NFD /Encoding 3 -1 roll put } { pop } ifelse NFD dup /FontType get 3 ne {/CharStrings} {/CharProcs} ifelse 2 copy known { 2 copy get dup maxlength dict copy [ /questiondown /space ] { 2 c= opy known { 2 copy get 2 index /.notdef 3 -1 roll put pop exit}if pop= } forall put } { pop pop } ifelse dup NFD /FontName 3 -1 roll put NFD definefont pop end } bind def /UseFont % stack: size, Declared-Font { findfont exch scalefont setfont } bind def /UseRGBFont %stack: red, green, blue, size, Declared-Font { UseFont setrgbcolor } bind def /Use256rgbFont %stack: red, green, blue, size, Declared-Font { UseFont set256rgb } bind def %%%%%%%%%%%%%%%%%%%%%%% % Font Usage Example: % %%%%%%%%%%%%%%%%%%%%%%% % % Declare Times-Roman font with latin1 encoding % /F0 /latin1-Encoding /Times-Roman DeclareFont % % Draw Letter A at position 0 0 % 10 /F0 UseFont 0 0 moveto (A) show % % Draw Color Letter B at position 10 10 % gsave % 256 128 0 10 /F0 Use256rgbFont 10 10 moveto (B) show % grestore %%%% End of Example %%% """ AdobeEnc =3D { ... 0x0020 : '/space', 0x0021 : '/exclam', 0x0022 : '/quotedbl', 0x0023 : '/numbersign', 0x0024 : '/dollar', 0x0025 : '/percent', 0x0026 : '/ampersand', ... 0x03A5 : '/Upsilon', 0x03A6 : '/Phi', 0x03A7 : '/Chi', 0x03A8 : '/Psi', 0x03A9 : '/Omega', ... } class Encoding(object): def __init__(self, enc): self.enc =3D self.encoding =3D self.id =3D enc vector =3D [] for i in range(256): try: ui =3D ord(chr(i).decode(enc)) except UnicodeDecodeError: vector.append("/.notdef") else: vector.append(AdobeEnc.get(ui, "/uni%04X"%ui)) self.vector =3D vector def __eq__(self, other): return self.enc=3D=3Dother.enc def __ne__(self, other): return not self=3D=3Dother def __str__(self): enc =3D self.encoding prolog =3D "% Use encoding "+enc+"\n" prolog =3D prolog + "/%(enc)s-Encoding [\n"%vars() prolog =3D prolog + "\n".join( [" ".join(self.vector[0+x*8:8+x*8]) for x in range(32)] ) prolog =3D prolog + "\n] /Encoding defineresource pop" return prolog --=20 Sensory yours, Eugene Minkovskii =F3=C5=CE=D3=CF=D2=CE=CF =D7=C1=DB, =E5=D7=C7=C5=CE=C9=CA =ED=C9=CE=D8=CB= =CF=D7=D3=CB=C9=CA |
From: Andre W. <wo...@us...> - 2005-07-20 10:50:46
|
Hi, On 20.07.05, Eugene M. Minkovskii wrote: > I do some small time-test with your pux programm: > *************** time test begin ******************** > from pyx import * > > import timeit > > s=''' > c = canvas.canvas() > c.text(0, 0, "Hello, world!") > c.stroke(path.line(0, 0, 2, 0)) > ''' > t = timeit.Timer(s,"from pyx import canvas, path") > print "%5.2f --- initialization" % t.timeit(number=100) > > c = canvas.canvas() > c.stroke(path.line(0, 0, 2, 0)) > > t = timeit.Timer('c.writeEPSfile("hello")',"from __main__ import c") > print "%5.2f --- writing EPS file without text" % t.timeit(number=100) > t = timeit.Timer('c.writePDFfile("hello")',"from __main__ import c") > print "%5.2f --- writing PDF file without text" % t.timeit(number=100) > > c = canvas.canvas() > c.text(0, 0, "Hello, world!") > c.stroke(path.line(0, 0, 2, 0)) > > t = timeit.Timer('c.writeEPSfile("hello")',"from __main__ import c") > print "%5.2f --- writing EPS file with text" % t.timeit(number=100) > t = timeit.Timer('c.writePDFfile("hello")',"from __main__ import c") > print "%5.2f --- writing PDF file with text" % t.timeit(number=100) > *************** time test output ******************* > 0.98 --- initialization > 0.16 --- writing EPS file without text > 0.29 --- writing PDF file without text > 26.95 --- writing EPS file with text > 8.20 --- writing PDF file with text > *************** time test edn ********************** > > We see: your method of text-inclusion very good, because you > produse good platform-independend PostScript. But this method > very slow. Parts of the slowlyness you've observed is very likely due to a code reorganisation we did for 0.8. We found out after that release, that this creates a huge number of file path lookups which are very slow, when you do not build the kpathsea extension module. I've submitted a patch to reduce the time consuming system calls. Expect this to be released within an 0.8.1 during the next days. But still, as long as you do not build the kpathsea extension module, you'll always need to perform system calls for finding files in your tex directory structure. Beside that: if you see such a long times on a very simple example like a "hello, world!", its very likely that you can optimize your kpathsearch system quite a bit. How long takes a command like "kpsewhich cmr10.pfb" on your system? This shouldn't take too long (much, much less than a second). Building the kpathsea c extension module will still be much better (and is not affected by the code reorganization misbehaviour in 0.8). > Some time I don't need platform-independend > PostScript, But I need very fast method of file generation. For > example: in dinamic web-script I produce automatically generated > picture, and piping it through ghostscript to produce png. But this will not really become fast either. I mean, fast. It just will be less slow. For usual things the speed of PyX is ok, but it's not really fast. While at some points we already take care of execution speed, this is not a major issue at the moment as long as PyX is not unusable slow ... > This problem I solute by following method: > I use only standart fonts (Times-Roman, Courier, Helvetica), I > don't include this font into PostScript. If I need to use some > 8-bit encodings (koi8-r for example), I generate on-the-fly from > python Encoding-Vector for postscript. After that text may be > typing as is in row native 8-bit encoding > > I attach sample of my code at the end of this letter. As you can > see, my method can working without TeX. Of cource I can't type > hardly mathematical formuls, but simple text under diagram axis > can. This looks very familiar to me. I implemented similar things in a so called simpletext canvasitem some time ago. But you can build those things on top of PyX without touchin PyX internals. Just create your own canvas items and do whatever you want ... BTW: for the future its very likely, that we'll gain a TeX-less text output technique by further working on the separation of the font handling. We might even gain a replacement for the texrunner by that. This is certainly possible but it'll take time ... André -- by _ _ _ Dr. André Wobst / \ \ / ) wo...@us..., http://www.wobsta.de/ / _ \ \/\/ / PyX - High quality PostScript figures with Python & TeX (_/ \_)_/\_/ visit http://pyx.sourceforge.net/ |