This is even faster than acl's code, for data with positive elements appearing early on, because it stops as soon as it finds a positive.
ff = Compile[{{l, _Real, 1}},
Module[{i = 1, n = Length@l},
While[Compile`GetElement[l, i] <= 0. && i <= n, i = i + 1];
i <= n], "RuntimeOptions" -> "Speed", CompilationTarget -> "C"];
Since the OP specifies real numbers I've changed acl's function to take reals:
f = Compile[{{l, _Real, 1}},
Module[{max = -1.},
Do[If[max < Compile`GetElement[l, i], max = Compile`GetElement[l, i]], {i, 1, Length@l}];
max > 0], "RuntimeOptions" -> "Speed", CompilationTarget -> "C"];
Here is some timing data where I've inserted a single positive element into the list at varying positions:
b = RandomReal[{-1*^7, 0}, 1*^7];
timedata = Table[
a = b; a[[10^j]] = 1.0; {10^j,
{MemberQ[a, _?Positive] // timeAvg,
Total@UnitStep[-a] =!= Length@a // timeAvg,
Positive@Max@a // timeAvg,
f[a] // timeAvg,
ff[a] // timeAvg}}
, {j, 1, 7}];
ListLogLogPlot[Transpose[Thread /@ timedata], Joined -> True]
