Re:Speed of writing in Mathematica 3.01
- To: mathgroup@smc.vnet.net
- Subject: [mg11884] Re:Speed of writing in Mathematica 3.01
- From: Andrzej Kozlowski <andrzej@tuins.ac.jp>
- Date: Fri, 3 Apr 1998 03:45:39 -0500
>Date: Wed, 1 Apr 1998 21:49:44 +0900 >To: mathgroup@smc.vnet.net >From: Andrzej Kozlowski <andrzej@tuins.ac.jp> To: mathgroup@smc.vnet.net >Subject: [mg11884] Re:Speed of writing in Mathematica 3.01 >Cc: bridges@en.com >Bcc: >X-Attachments: > > >In article <6fd5ag$6aq@smc.vnet.net>, bridges@en.com (James Bridges) wrote: > >> Am I doing something wrong or is it supposed to take orders of magnitude >> longer than is reasonable to write out a simple ASCII file from >> Mathematica? Consider this simple test: >> >> In[7]:= >> a=Table [i,{i,1,1001}]; >> >> In[8]:= >> Timing[ >> filename="Macintosh HD:test.ascii"; >> output=OpenWrite[filename]; >> Do[ >> Write[output,a[[i]]]; >> ,{i,1,1001}]; >> Close[output]; >> ] >> >> Out[8]= >> {23.4 Second,Null} >> >> 23 seconds to write 1001 integers?! On a 233MHz G3! Everything else is >> whiff-bam fast, but writing is glacial. Now this is a simplified >> example of what I need to do but it contains one of the factors, namely >> that I have to individually write out elements of a list, hence the Do >> loop. Any hints? >> > James Bridges >> > >Here is one fast way do this sort of thing: > >In[3]:= >fast=OpenWrite["test"] >Out[3]= >OutputStream["test",8] >In[4]:= >Write[fast,Table[n,{n,1,1000}]]//Timing >Out[4]= >{0.0833333 Second,Null} >In[5]:= >Close[fast] >Out[5]= >"test" >(PowerMac G3 266 MHz) > >Andrzej Kozlowski > > The example of fast Write which I sent earlier writes to file in a form suitable for input into Mathematica. In other words you get a list {1,2,3,...}. Actually, however your problem was that you wrapped "Timing" around the entire composite expression, so you were not really timing "Write" at all. If you only time "Write" you get a much faster answer: In[28]:= one=OpenWrite["test"] Out[28]= OutputStream["test",11] In[29]:= t=Table[i,{i,1,1001}]; In[30]:= Do[Write[one,t[[i]]],{i,1,1001}]//Timing Out[30]= {0.166667 Second,Null} In[31]:= Close[one] Out[31]= "test" You can still make it somewhat faster by not breaking up the list In[32]:= two=OpenWrite["test2"] Out[32]= OutputStream["test2",12] In[33]:= Write[two,TableForm[Table[i,{i,1,1001}]]//OutputForm]//Timing Out[33]= {0.116667 Second,Null} In[34]:= Close[two] Out[34]= "test2" Andrzej Kozlowski (All on G3 266 MHZ)